C 增量运算符和逻辑运算符优先级
在下面所示的程序中,应该首先计算前缀,因为它具有更高的优先级,但答案是C 增量运算符和逻辑运算符优先级,c,pre-increment,C,Pre Increment,在下面所示的程序中,应该首先计算前缀,因为它具有更高的优先级,但答案是-2,2,0,1,并且在“as LHS of | | is true”一书中解释了这一点。不计算RHS。“ 为什么会这样?应首先执行所有增量,然后检查逻辑,因为优先级较高 #include<stdio.h> int main() { int i=-3, j=2, k=0, m; m = ++i || ++j && ++k; printf("%d, %d, %d, %d\n"
-2,2,0,1
,并且在“as LHS of | | is true”一书中解释了这一点。不计算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;
}
#包括
int main()
{
int i=-3,j=2,k=0,m;
m=++i | |++j&&++k;
printf(“%d,%d,%d,%d\n”,i,j,k,m);
返回0;
}
运算符优先级是完全不同的事情。评估顺序由副作用和顺序点决定
请参阅评估顺序手册。不要混淆评估的优先级和顺序
逻辑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计算结果为true(1
),而RHS则不计算。因此,j
和k
都不会增加。打印结果如下:m
被分配1
,i
成为-2
,j
保持为2
,k
保持为0
唯一剩下的问题是&&
绑定比|
更紧密,因此:
a || b && c
相当于:
a || (b && c)
因此,如果
a
的计算结果为true(非零),则b
和c
都不会被计算。优先级与计算顺序完全无关。@user2357112请根据您的答案详细说明优先级在上述答案中没有作用?@rakeb请仔细阅读答案,当然,优先权很重要,但是评估的顺序是你首先要考虑的事情。由于LHS为真,因此根本不会对RHS进行评估。表示,++j&&++k代码>不会执行并增加其值。当计算任何代码行/代码块时,问题是它们的优先级。