为什么不评估预增量

时间:2017-10-13 14:27:49

标签: c logical-operators pre-increment

#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,为什么?

2 个答案:

答案 0 :(得分:4)

这是因为短路。如果您有a && b,那么只有在b为真时才会评估a。同样,如果您有a || b,那么只有在b为假时才会评估a

在您的情况下,++a && ++b || ++c组为(++a && ++b) || ++c。第一个++a被评估,这是真的,所以++b被评估,它也是如此。此时,评估停止,因为现在确定||运算符的结果为真,因此永远不会评估++c

答案 1 :(得分:2)

因为||如果左侧评估为真,则不评估右侧。在您的示例中,

++a && ++b

计算为非零,将其视为真。因此,根据延迟评估的规则,++c被完全忽略。