在下面显示的程序中,首先应该评估前缀,因为它具有更高的优先级,但是答案是-2, 2, 0, 1
,并且在书中解释了"作为||的LHS是真的RHS未被评估。"
为什么会这样?应首先执行所有增量,然后由于优先级检查逻辑。
#include<stdio.h>
int main()
{
int i=-3, j=2, k=0, m;
m = ++i || ++j && ++k;
printf("%d, %d, %d, %d\n", i, j, k, m);
return 0;
}
答案 0 :(得分:7)
不要与优先和评估顺序混淆。
逻辑 OR ||
的评估顺序是从左到右。
因此,如果left = true
,则left || right
永远不会执行right
。在您的代码中完全相同。
如您所知,在C中被视为true
的任何非零值,因此++i
或-2
都是true
。所以,
m = ++i || ++j && ++k;
m = true || bla bla bla; //right not even checked!
m = true
m = 1
您可以按预期获得输出。
答案 1 :(得分:2)
逻辑&&
和||
运算符在对RHS进行任何评估之前会对LHS进行全面评估。
在显示的代码中,由于++i
为-2
,因此||
的LHS评估为真(1
),并且不评估RHS。因此,j
和k
都不会增加。打印结果如下:m
已分配1
,i
已成为-2
,j
仍为2
且k
已停留为0
。
唯一剩下的问题是&&
比||
更紧密,所以:
a || b && c
相当于:
a || (b && c)
因此,如果a
的计算结果为真(非零),那么b
和c
都不会被评估。
答案 2 :(得分:0)
运营商优先权是完全不同的事情。评估顺序由副作用和序列点决定。
请参阅评估顺序的this 手册。