使用逻辑运算符时无法理解执行

时间:2016-03-11 13:24:48

标签: c++ c logical-operators

这是代码:

void main()
{
    clrscr();
    int a=-3 , b=2 , c=0, d;
    d = ++a && ++b || ++c;
    printf("a=%d , b=%d , c=%d, d=%d ",a,b,c,d);
    getch();
}

输出:-2 , 3 , 0 , 1

我无法理解为什么c的值不会增加,我认为它应该是1以及如何输出d = 1

1 个答案:

答案 0 :(得分:7)

陈述;

d = ++a && ++b || ++c;

从左到右分组(给定precedence of &&);

d = (++a && ++b) || ++c;

因此,在评估&&时,由于第一个操作数为真(++a),因此评估第二个操作数(++b)。此时,此逻辑AND的结果为true;因此逻辑OR为真,其第二个操作数未被评估(++c)。

这种行为是有保证的,通常称为短路评估。 C ++和C标准中的措辞是listed here, in this answer;这里简要回顾一下C ++;

§5.14逻辑AND运算符

  

1 &&运算符组从左到右。操作数都在上下文中转换为bool(第4条)。如果两个操作数都为真,则结果为true,否则为false。与&不同,&&保证从左到右的评估:如果第一个操作数为假,则不评估第二个操作数。

§5.15逻辑OR运算符

  

1 ||运算符组从左到右。操作数都在上下文中转换为bool(第4条)。如果其任一操作数为true,则返回true,否则返回false。与|不同,||保证从左到右的评估;此外,如果第一个操作数的计算结果为true,则不计算第二个操作数。