【发布时间】:2021-10-24 08:17:15
【问题描述】:
int a = 2;
if((a = a-3 && --a ) || a--)
cout<<a<<endl;
我的疑问是,( a = a-3 && --a) 会使 a = -1 因为 a-3 = -1。左侧评估什么?如果编译器确实转到 OR 的右侧,它是从左侧获取 a 的原始值(即 2)还是 a 的修改值 此代码 1 的输出如何?引擎盖下发生了什么?是不是只执行了一侧的 if 语句?
【问题讨论】:
-
您期望
a-3 && --a的评估结果是什么? (不确定问题是运算符优先级还是短路。) -
是时候开始关注旧的运算符优先级表 (en.cppreference.com/w/cpp/language/operator_precedence)...对于在真实程序中编写此类代码的任何人来说,地狱中都有一个特殊的地方:)
-
只是把它拼出来,
a = a-3 && --a是,用额外的括号突出优先顺序,a = ((a-3) && --a) -
你正在混合运算符优先级理解和布尔值Short-circuit_evaluation:你没有帮助自己学习。对于
&&和||运算符:在 c++ 中,仅当左侧“不足以”获得结果时才评估右侧操作数:如果||(或)的左侧为真,则结果将无论如何都是正确的,并且根据设计,正确的部分没有被评估 -
考虑一个知道发生了什么的人的观点,你可能想回答你的问题。此人可能会查看您的代码并发现显然输出应该是
1,无需解释。这使我们陷入了非生产性的僵局。你说输出不应该是1,而另一个人说应该。没有生产力。如果其中一个人解释了评估,那将会有所帮助。我建议你担任这个角色,为任何回答的人树立一个好榜样。您期望输出是什么,为什么?
标签: c++ if-statement logical-operators