繁体   English   中英

和&或运算符在后增量运算符上的工作差异

[英]diffrence in working of post increment operator with and & or operator

这种后递增运算符的用法令人困惑。

{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值没有增加,但是如果我用&&运算符替换它,它的值会增加。 为什么?

引用C11 ,第§6.5.14章( 重点是我的

不像按位| 运算符, || 运营商保证从左到右的评估; 如果对第二个操作数求值,则在第一个和第二个操作数的求值之间有一个序列点。 如果第一个操作数比较不等于0 ,则不计算第二个操作数。

所以,就您而言,

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

是相同的

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

然后,评估第a++括号内的语句,首先将a++ (后递增)评估为0(待处理的副作用),因此第一个||的RHS。 被求值b++ ,产生1和||的结果 运算为TRUE,得出1。

结果1是第二个||的LHS。 因此,第二个||的RHS c++ )不再进行求值,最终结果变为TRUE,再次产生1 ,并将其存储在d

所以,最后,

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

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

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

因此,如果您替换最后一个|| 使用&& ,然后对于外部语句,LHS变为1,并且RHS进行评估,使c++被评估并增加,这是一个副作用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM