代码:
#include "bits/stdc++.h"
using namespace std;
int main()
{
int a=0;
a&&++a;
cout<<a<<endl;
}
输出得到0
但是运算符++的优先级不应该高于&&吗,为什么先判断了&&,导致 a 的数值没有改变?
代码:
#include "bits/stdc++.h"
using namespace std;
int main()
{
int a=0;
a&&++a;
cout<<a<<endl;
}
输出得到0
但是运算符++的优先级不应该高于&&吗,为什么先判断了&&,导致 a 的数值没有改变?
|
1
建议不要纠结这种问题,在实际工作中毫无意义,写成这样还会被打。
问题回答:我也不知道。 |
|
2
@muzuiget 但是期末考试会考。。。
|
|
3
@learningman 老师敢出这样的题你直接把考卷摔老师脸上
|
|
4
只记得&&运算符遇到左边算子是 0 时自动短路不计算右边的值。。同意 1L 说法
|
|
McZodenFeb 6, 2020
5
a = 0 后,判断语句一定是 false,&& 右侧就不需要再判断了,所以也不会执行,我是这么猜的
|
|
6
@phpfpm 去年已经出过了。。。不具备可操作意义
|
|
7
@enchilada2020 &&本身作为一个逻辑运算符,为什么先执行短路原则呢?++的优先级更高
|
|
NaseiFeb 6, 2020 via Android
8
短路
|
|
9
@learningman 因为那行语句本身的目的是求一个逻辑表达式的值,左侧的 a 进行评估后已经足以得出完整表达式的最终值了。非要运算右侧会被人喷的,浪费资源不环保,:)
|
|
10
@learningman 破案了 这是属于概念混淆 运算优先级不等于求值顺序 而 && 的求值顺序是先左后右 先左发现是 0 则直接短路不求右了
|
|
11
@dandycheung 我查到了一句话:优先级与求值顺序无关。
那么在一个表达式的执行过程中,优先级又做了什么。。。。仅仅只负责结合顺序的判断吗 |
|
12
@enchilada2020 那么在一个表达式的执行过程中,优先级又做了什么。。。
|
|
bp0Feb 6, 2020
13
++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
运算符优先级是指该运算符优先结合,而不是该运算符优先执行
这是一个非常正常的 && 操作符短路特性 |
|
16
@learningman 15L 的解释足够清楚了:)
|
|
17
内建运算符 && 和 || 进行短路求值(若在求值第一个操作数后结果已知,则不求值第二个),但重载的运算符表现类似函数调用,并始终对两个操作数都进行求值。
zh.cppreference.com/w/cpp/language/operator_logical |
|
18
短路求值,沙雕学校喜欢考这种东西
|
|
ExplorerLogFeb 6, 2020
19
简称:优化
|
|
midasplusFeb 7, 2020 via Android
20
运算符优先级优先的是结合的顺序,并不是数值的顺序。大多数运算的求值顺序都是不确定的,貌似确定的只有 && ,||,问号运算符和逗号运算符的求值顺序是确定的
|
|
nvkouFeb 7, 2020 via Android
22
该不会还在用谭浩强吧
|
|
leidoFeb 7, 2020 via Android
23
一看就是短路求值啊
|
|
24
a == 0,所以表达式 a&&++a 结果为 false,++a 没有执行。
|
|
25
学校再敢这么出题,真是要再毁下一代码农啊?那么多好的思想概念不去深究,老是搞这些糟粕,哎。
程序写出来还是要给人看的,这是学校最应该教的。 |
|
26
不确定的情况请用括号
|
|
bruce00Feb 7, 2020
27
昨天刚好看到这章,C 语言程序设计(第三版)(苏小红)第 81 页,“注意,运算符 && 和 || 都具有‘短路’特性”,既然是特性。。。emmmmm
|
|
sumarkerFeb 7, 2020
28
并不实用
其实我也不会 建议分行并加括号 |
|
52coderFeb 7, 2020
29
a==0,&&的结果一定为 0,不会往后走了,不涉及优先级问题,&&就是要先计算左边。
|
|
inhzusFeb 7, 2020 via Android
30
等价于 if(!a) ++a;
|
|
31
@nvkou C Primer Plus
|
|
32
@nvkou 学校发的确实是谭浩强。。。
|
|
lance6716Feb 7, 2020
33
这个&&用他的短路特性,还不算偏吧,好多场景都这么用
|
|
xFryeFeb 8, 2020
34
你问老师出这种题目的意义是什么。。 括号这么好用的运算符不用
|