这是代码:
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
。
答案 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,则不计算第二个操作数。