增量和逻辑运算符优先级

Increment and logical operators precedence

在下面的程序中,prefix应该先被计算,因为它有更高的优先级,但是答案是-2, 2, 0, 1并且在书中有解释"as LHS of || is true RHS is not evaluated."
为什么会这样?所有增量都应该首先执行,然后由于优先级的原因应该检查逻辑。

#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;
}

运算符优先级是完全不同的东西。评估顺序由副作用和序列点决定。

参见this 评估顺序手册。

不要混淆优先级求值顺序

逻辑OR||的求值顺序是从左到右。

所以如果 left = true 那么 left || right 永远不会执行 right。在您的代码中发生了完全相同的情况。

如您所知,任何非零值在 C 中都被视为 true,因此,++i-2true。所以,

 m = ++i || ++j && ++k;
 m = true || bla bla bla; //right not even checked!
 m = true 
 m = 1

你得到了预期的输出。

逻辑 &&|| 运算符在对 RHS 进行任何计算之前完全计算 LHS。

在显示的代码中,由于 ++i-2,因此 || 的 LHS 计算结果为真 (1),而 RHS 未计算。因此,jk 都不会递增。打印结果如下:m赋值为1i变为-2j保持为2k保持不变作为 0.

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

a || b && c

相当于:

a || (b && c)

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