增量和逻辑运算符优先级
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
或 -2
是 true
。所以,
m = ++i || ++j && ++k;
m = true || bla bla bla; //right not even checked!
m = true
m = 1
你得到了预期的输出。
逻辑 &&
和 ||
运算符在对 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
都不会被计算。
在下面的程序中,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
或 -2
是 true
。所以,
m = ++i || ++j && ++k;
m = true || bla bla bla; //right not even checked!
m = true
m = 1
你得到了预期的输出。
逻辑 &&
和 ||
运算符在对 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
都不会被计算。