#include <stdio.h>
int main(){
int a=5,b=-7,c=0,d;
d=++a && ++b || ++c;
printf("%d %d %d %d",a,b,c,d);
}
这里c的值应该增加到1,但它给0,为什么?
答案 0 :(得分:4)
这是因为短路。如果您有a && b
,那么只有在b
为真时才会评估a
。同样,如果您有a || b
,那么只有在b
为假时才会评估a
。
在您的情况下,++a && ++b || ++c
组为(++a && ++b) || ++c
。第一个++a
被评估,这是真的,所以++b
被评估,它也是如此。此时,评估停止,因为现在确定||
运算符的结果为真,因此永远不会评估++c
。
答案 1 :(得分:2)
因为||如果左侧评估为真,则不评估右侧。在您的示例中,
++a && ++b
计算为非零,将其视为真。因此,根据延迟评估的规则,++c
被完全忽略。