[英]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.