增量和逻辑运算符优先级

时间:2015-07-03 05:02:09

标签: c pre-increment

在下面显示的程序中,首先应该评估前缀,因为它具有更高的优先级,但是答案是-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;
}

3 个答案:

答案 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。因此,jk都不会增加。打印结果如下:m已分配1i已成为-2j仍为2k已停留为0

唯一剩下的问题是&&||更紧密,所以:

a || b && c

相当于:

a || (b && c)

因此,如果a的计算结果为真(非零),那么bc都不会被评估。

答案 2 :(得分:0)

运营商优先权是完全不同的事情。评估顺序由副作用和序列点决定。

请参阅评估顺序的this 手册。