
代码:
#include "bits/stdc++.h" using namespace std; int main() { int a=0; a&&++a; cout<<a<<endl; } 输出得到
但是运算符++的优先级不应该高于&&吗,为什么先判断了&&,导致 a 的数值没有改变?
1 muzuiget 2020-02-06 21:33:01 +08:00 建议不要纠结这种问题,在实际工作中毫无意义,写成这样还会被打。 问题回答:我也不知道。 |
2 learningman OP @muzuiget 但是期末考试会考。。。 |
3 phpfpm 2020-02-06 21:35:22 +08:00 @learningman 老师敢出这样的题你直接把考卷摔老师脸上 |
4 KMpAn8Obw1QhPoEP 2020-02-06 21:37:20 +08:00 via Android 只记得&&运算符遇到左边算子是 0 时自动短路不计算右边的值。。同意 1L 说法 |
5 McZoden 2020-02-06 21:37:55 +08:00 a = 0 后,判断语句一定是 false,&& 右侧就不需要再判断了,所以也不会执行,我是这么猜的 |
6 learningman OP @phpfpm 去年已经出过了。。。不具备可操作意义 |
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 @learningman 因为那行语句本身的目的是求一个逻辑表达式的值,左侧的 a 进行评估后已经足以得出完整表达式的最终值了。非要运算右侧会被人喷的,浪费资源不环保,:) |
10 KMpAn8Obw1QhPoEP 2020-02-06 21:46:52 +08:00 via Android @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 摘抄自 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 运算符优先级是指该运算符优先结合,而不是该运算符优先执行 这是一个非常正常的 && 操作符短路特性 |
16 KMpAn8Obw1QhPoEP 2020-02-06 21:52:18 +08:00 via Android @learningman 15L 的解释足够清楚了:) |
17 mxalbert1996 2020-02-06 22:02:29 +08:00 内建运算符 && 和 || 进行短路求值(若在求值第一个操作数后结果已知,则不求值第二个),但重载的运算符表现类似函数调用,并始终对两个操作数都进行求值。 zh.cppreference.com/w/cpp/language/operator_logical |
18 vkhsyj 2020-02-06 22:46:49 +08:00 短路求值,沙雕学校喜欢考这种东西 |
19 ExplorerLog 2020-02-06 22:57:20 +08:00 简称:优化 |
20 midasplus 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 a == 0,所以表达式 a&&++a 结果为 false,++a 没有执行。 |
25 BingZ 2020-02-07 09:19:37 +08:00 学校再敢这么出题,真是要再毁下一代码农啊?那么多好的思想概念不去深究,老是搞这些糟粕,哎。 程序写出来还是要给人看的,这是学校最应该教的。 |
26 fuchunliu 2020-02-07 09:32:07 +08:00 via Android 不确定的情况请用括号 |
27 bruce00 2020-02-07 10:04:56 +08:00 昨天刚好看到这章,C 语言程序设计(第三版)(苏小红)第 81 页,“注意,运算符 && 和 || 都具有‘短路’特性”,既然是特性。。。emmmmm |
28 sumarker PRO 并不实用 其实我也不会 建议分行并加括号 |
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 你问老师出这种题目的意义是什么。。 括号这么好用的运算符不用 |