1
#include<stdio.h>
void main(){

int x,y,z;
x=y=z=1;
z=++x||++y&&++z;
printf("%d %d %d \n",x,y,z);
getch();
}

输出为 2 1 1 !我无法理解为什么...如果我们按照运算符的优先级进行,则无法解释。请帮忙

4

5 回答 5

6

逻辑or( ||) 引入了一个序列点。评估其左侧。然后,当且仅当它产生 0/false 时,才评估右侧。

在这种情况下,++x结果为 2,因此永远不会评估右侧。反过来,这意味着yz保持为1

于 2012-07-02T04:24:09.557 回答
3

||操作员短路。首先计算左侧操作数,如果计算结果为非零,则永远不会计算右侧操作数。这也防止了对右操作数求值的副作用。

于 2012-07-02T04:22:42.517 回答
1

当你使用 || 运算符,如果 LHS 结果为真,则最终结果为真。所以,++x 结果是 1,最终结果是 ++x = 2 和 z = 1 & y = 1

于 2012-07-02T04:23:38.230 回答
1

布尔||短路。也就是说,一旦它找到一个真正的值,它就会停止评估。因此,在 z 赋值中发生的所有事情 x 递增,然后 z 设置为 1

于 2012-07-02T04:24:08.393 回答
0

上述答案的附录:

在 C/C++ 中,这些运算符是短路运算符,即 '&&'、'||' 和“?”(条件运算符)。

帮自己一个忙,看看这个关于短路评估的优秀 wiki 页面。不要错过文章的常见用法部分。

于 2012-07-02T09:45:53.023 回答