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不会执行并增加其值。当计算任何代码行/代码块时,问题是它们的优先级。