此增量后操作符的使用令人困惑。
{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
的值没有增加,但如果我用&&
运算符替换它会增加。为什么呢?
答案 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评估,使得&&
被评估并递增,如副作用。