代码:
#include "bits/stdc++.h"
using namespace std;
int main()
{
int a=0;
a&&++a;
cout<<a<<endl;
}
输出得到0
但是运算符++
的优先级不应该高于&&
吗,为什么先判断了&&
,导致 a 的数值没有改变?
1
muzuiget 2020-02-06 21:33:01 +08:00 9
建议不要纠结这种问题,在实际工作中毫无意义,写成这样还会被打。
问题回答:我也不知道。 |
2
learningman OP @muzuiget 但是期末考试会考。。。
|
3
phpfpm 2020-02-06 21:35:22 +08:00 1
@learningman 老师敢出这样的题你直接把考卷摔老师脸上
|
4
enchilada2020 2020-02-06 21:37:20 +08:00 via Android 2
只记得&&运算符遇到左边算子是 0 时自动短路不计算右边的值。。同意 1L 说法
|
5
McZoden 2020-02-06 21:37:55 +08:00
a = 0 后,判断语句一定是 false,&& 右侧就不需要再判断了,所以也不会执行,我是这么猜的
|
6
learningman OP @phpfpm 去年已经出过了。。。不具备可操作意义
|
7
learningman OP @enchilada2020 &&本身作为一个逻辑运算符,为什么先执行短路原则呢?++的优先级更高
|
8
Nasei 2020-02-06 21:40:07 +08:00 via Android
短路
|
9
dandycheung 2020-02-06 21:44:34 +08:00 via iPhone 1
@learningman 因为那行语句本身的目的是求一个逻辑表达式的值,左侧的 a 进行评估后已经足以得出完整表达式的最终值了。非要运算右侧会被人喷的,浪费资源不环保,:)
|
10
enchilada2020 2020-02-06 21:46:52 +08:00 via Android 1
@learningman 破案了 这是属于概念混淆 运算优先级不等于求值顺序 而 && 的求值顺序是先左后右 先左发现是 0 则直接短路不求右了
|
11
learningman OP @dandycheung 我查到了一句话:优先级与求值顺序无关。
那么在一个表达式的执行过程中,优先级又做了什么。。。。仅仅只负责结合顺序的判断吗 |
12
learningman OP @enchilada2020 那么在一个表达式的执行过程中,优先级又做了什么。。。
|
13
bp0 2020-02-06 21:48:18 +08:00
++a 没有执行,原因上面已经说了,短路求值。a == 0,整个语句已经有结果( false ),自然不需要在计算右边的语句了。
|
14
CismonX 2020-02-06 21:49:52 +08:00 1
摘抄自 ISO/IEC 9899:201x 第 6.5.13 节:
Unlike the bitwise binary & operator, the && operator guarantees left-to-right evaluation; if the second operand is evaluated, there is a sequence point between the evaluations of the first and second operands. If the first operand compares equal to 0, the second operand is not evaluated. 显然最终 a 的结果是 0 |
15
fcten 2020-02-06 21:50:22 +08:00 5
运算符优先级是指该运算符优先结合,而不是该运算符优先执行
这是一个非常正常的 && 操作符短路特性 |
16
enchilada2020 2020-02-06 21:52:18 +08:00 via Android 1
@learningman 15L 的解释足够清楚了:)
|
17
mxalbert1996 2020-02-06 22:02:29 +08:00 1
内建运算符 && 和 || 进行短路求值(若在求值第一个操作数后结果已知,则不求值第二个),但重载的运算符表现类似函数调用,并始终对两个操作数都进行求值。
zh.cppreference.com/w/cpp/language/operator_logical |
18
vkhsyj 2020-02-06 22:46:49 +08:00 1
短路求值,沙雕学校喜欢考这种东西
|
19
ExplorerLog 2020-02-06 22:57:20 +08:00
简称:优化
|
20
111qqz 2020-02-07 01:17:57 +08:00 via Android
运算符优先级优先的是结合的顺序,并不是数值的顺序。大多数运算的求值顺序都是不确定的,貌似确定的只有 && ,||,问号运算符和逗号运算符的求值顺序是确定的
|
22
nvkou 2020-02-07 01:58:04 +08:00 via Android
该不会还在用谭浩强吧
|
23
leido 2020-02-07 03:02:28 +08:00 via Android
一看就是短路求值啊
|
24
jeenysem 2020-02-07 09:17:57 +08:00 via Android 1
a == 0,所以表达式 a&&++a 结果为 false,++a 没有执行。
|
25
BingZ 2020-02-07 09:19:37 +08:00 1
学校再敢这么出题,真是要再毁下一代码农啊?那么多好的思想概念不去深究,老是搞这些糟粕,哎。
程序写出来还是要给人看的,这是学校最应该教的。 |
26
fuchunliu 2020-02-07 09:32:07 +08:00 via Android 1
不确定的情况请用括号
|
27
bruce00 2020-02-07 10:04:56 +08:00
昨天刚好看到这章,C 语言程序设计(第三版)(苏小红)第 81 页,“注意,运算符 && 和 || 都具有‘短路’特性”,既然是特性。。。emmmmm
|
28
sumarker 2020-02-07 10:15:20 +08:00
并不实用
其实我也不会 建议分行并加括号 |
29
52coder 2020-02-07 10:32:54 +08:00
a==0,&&的结果一定为 0,不会往后走了,不涉及优先级问题,&&就是要先计算左边。
|
30
inhzus 2020-02-07 11:57:31 +08:00 via Android
等价于 if(!a) ++a;
|
31
learningman OP @nvkou C Primer Plus
|
32
learningman OP @nvkou 学校发的确实是谭浩强。。。
|
33
lance6716 2020-02-07 17:36:26 +08:00
这个&&用他的短路特性,还不算偏吧,好多场景都这么用
|
34
xFrye 2020-02-08 01:10:06 +08:00
你问老师出这种题目的意义是什么。。 括号这么好用的运算符不用
|