使用和& amp;的后增量运算符的工作差异或运营商

时间:2016-10-09 10:34:11

标签: c

此增量后操作符的使用令人困惑。

{int a=0,b=1,c=2,d;
d=a++||b++||c++
printf("%d %d %d %d",a,b,c,d);}

输出

  

1,2,2,1

c的值没有增加,但如果我用&&运算符替换它会增加。为什么呢?

1 个答案:

答案 0 :(得分:2)

引用C11,章节§6.5.14,(强调我的

  

与按位|运算符不同,||运算符保证从左到右的评估;如果   评估第二个操作数,在第一个操作数的评估之间有一个序列点   和第二个操作数。 如果第一个操作数与0不相等,则第二个操作数为   未评估。

所以,在你的情况下,

 d=a++||b++||c++

相同
 d= ( (a++ || b++) || c++)      

然后,评估第一个括号内的语句,第一个a++(后递增)求值为0(副作用待定),因此评估第一个||的RHS,{ {1}},生成1并且b++操作的结果为TRUE,产生1。

结果||是第二个1的LHS。因此,第二个||||)的RHS不再被评估,最终结果变为TRUE,再次产生c++,其存储在1中。

所以,最后,

    评估
  • d,变为1
  • 评估
  • a++,变为2
  • b++ 评估,仍为2
  • c++的结果存储在||中,即为TRUE,因此存储1。

另一方面,对于逻辑AND d运算符,

  

[...]如果第一个操作数比较等于0,则第二个操作数   操作数未被评估。

因此,如果用&&替换最后一个||,那么对于外部语句,LHS变为1并且RHS评估,使得&&被评估并递增,如副作用。

相关问题