这里逻辑运算符如何短路?

Fre*_*gon 3 c logical-operators

#include <stdio.h>

int main()
{
   int x = -2;
   while (x++ || x==0)
   {
      printf("X");
   }
}
Run Code Online (Sandbox Code Playgroud)

输出如下

XX

为什么?

我期望这段代码进入无限循环,因为增量将使逻辑或的任一侧都为真。

dbu*_*ush 5

逻辑 OR 运算符保证在评估右侧(如果有的话)之前,将完全评估左侧,包括任何副作用。更正式地说,左侧的评估和右侧的评估之间存在一个序列点。

x当评估此条件时,如果为 0:

(x++ ||x==0)
Run Code Online (Sandbox Code Playgroud)

左侧将计算为 0,即 false,并x递增为 1。然后,因为左侧为 0,所以计算右侧。由于x现在为 1,右侧的计算结果也为 0,使条件为假并导致循环终止。