C编程++运算符

use*_*232 12 c post-increment

为什么这段代码总能产生x=2

unsigned int x = 0;
x++ || x++ || x++ || x++ || ........;
printf("%d\n",x);
Run Code Online (Sandbox Code Playgroud)

cob*_*bal 30

第1个x++将x更改为1并返回0
,第2个x++将x更改为2并返回1

此时或短路,返回true,并将x留在2.

  • @Chuck:它的定义是因为`||`充当序列点.(C99标准中6.5.14/4.) (12认同)
  • 顺便说一句:unsigned int x = 0; ++ x || ++ x || ++ x || ++ x || ........; 的printf( "%d \n" 个中,x); 将得到1,因为第一个++ x会将x更改为1并返回x,发生短路并且不会再做任何事情. (2认同)

Sud*_*shu 11

x ++ || x ++ || x ++ || x ++ || ........;

  • 对于条件检查,首先x ++首先计算为0,然后是增量.因此,第一个条件失败,但x增加到1.
  • 现在第二个x ++被评估,对于条件检查,其计算结果为1,并且x增加到2.由于表达式的计算结果为1(真),因此无需进一步.


Nik*_*sov 9

由于布尔表达式评估中的短路,因为||是C和C++中的序列点.


Zan*_*ano 5

||短路.从左边开始评估,当找到真值(非零)时,它会停止评估,因为表达式现在为真,永远不会再为假.

首先x++评估为0(因为它是后增量),第二个评估为1,这是真的,并且presto,你已经完成了!