我想知道为什么这个代码会产生2

Neg*_*ero 3 c

我不知道是否有人能为我解释这段代码?

unsigned int x = 0;
(x ^= x ) || x++ || ++x || x++;

printf("%d\n", x);
Run Code Online (Sandbox Code Playgroud)

当我使用gcc 4.2在我的计算机上编译它时,输出为2.

最初我想也许这个行为是未指定的,但后来我想|| 将优先于其他运营商,所以答案不应该是3吗?由于有三个"++".

谁能解释一下?谢谢

cni*_*tar 6

  • (x ^= x) 被评估,它产生0,因此:
  • (x++)被评估,它产生0,因此:
  • (++x)被评估,它产生2,因此它停止

这一切都归结为一条规则:||如果左侧是假的,则仅评估其右侧.


Mat*_* B. 5

问题是||运营商正在短路.一旦找到真值,就不再需要检查剩余的||陈述; 答案已经知道了.

(x ^= x)求值为0.
x++计算结果为0,然后递增x为1.
++x计算结果为2 - 为真.

最终或声明不需要计算.它"短路"并立即返回true.