我的书中有一个问题:
#include<stdio.h> void main() { int a=5,b=-7,c=0,d; d = ++a && ++b || ++c; printf("\n%d%d%d%d",a,b,c,d); }
这个问题问我代码的输出是什么.我跑了,屏幕上的结果是6-601.我理解为什么a = 6和b = -6,但我不明白为什么c = 0和d = 1?
解决方法
我相信你已经得到了答案,但只是逐步详细说明,让我在这里再补充一点.首先,引用&& amp;的特性.和||操作符,分别来自C11标准,章节§6.5.13和§6.5.13,
(一世)
The
&&
operator shall yield 1 if both of its operands compare unequal to 0; otherwise,it
yields 0. […] If the first operand compares equal to 0,the second
operand is not evaluated.
和
(II)
The
||
operator shall yield 1 if either of its operands compare unequal to 0; otherwise,it
yields 0. […]. If the first operand compares unequal to 0,the second operand is
not evaluated.
他们都保证从左到右的评估.所以,比较你的代码,
d = ++a && ++b || ++c;
它发生了
d = ((++a && ++b) || ++c );
评估为
d = (( 6 && ++b ) || ++c);
然后
d = ( ( 6 && (-6) ) || ++c);
现在在上面的阶段,(I)已经实现了,它归结为
d = ( 1 || ++c);
现在,遵循已经满足(II)的重点,因此没有进一步评估||的RHS操作数执行(即,不评估c),并且它看起来是d = 1并且最终结果1存储在d中.
那就是,a == 6,b == -6,c == 0和d == 1.
话虽如此,void main()应该改为int main(void),至少要符合标准.