'的优先级;或';和';和';C语言中的运算符

'的优先级;或';和';和';C语言中的运算符,c,logical-operators,ansi,C,Logical Operators,Ansi,在下面的代码中,我得到的结果是10 | 1 | 1。但根据优先规则,不应该首先计算“and”运算符?(并产生c=9),比如:d=a |(-b)和(-c),因为“and”具有更高的优先权。(或者短切会破坏优先规则?)提前谢谢 #include <stdio.h> #include <stdlib.h> int main(){ int a,b,c,d; a =1; b = c = 10; d = a|| --b&&--c;

在下面的代码中,我得到的结果是10 | 1 | 1。但根据优先规则,不应该首先计算“and”运算符?(并产生c=9),比如:d=a |(-b)和(-c),因为“and”具有更高的优先权。(或者短切会破坏优先规则?)提前谢谢

#include <stdio.h>
#include <stdlib.h>

int main(){
    int a,b,c,d;
    a =1;
    b = c = 10;
    d = a|| --b&&--c;
    printf("%d\n",c);
    printf("%d\n",a);
    printf("%d\n",d);
    return 0;
}
#包括
#包括
int main(){
INTA、b、c、d;
a=1;
b=c=10;
d=a | |--b&--c;
printf(“%d\n”,c);
printf(“%d\n”,a);
printf(“%d\n”,d);
返回0;
}

优先级和求值顺序是两件不同的事情。从文件(重点矿山):

在评估lhs后,有一个序列点。如果lhs的结果不等于零,则根本不评估rhs(所谓的短路评估)


exp1 | | exp2
的情况下,始终首先计算
exp1
,因为它后面有一个序列点,如果
exp1
为非零,则不计算
exp2

优先级仅确定哪些操作数与哪些运算符分组-它不控制表达式的求值顺序

在您的示例中,这意味着表达式被解析为

a || (––b && ––c)
|
&&
都强制从左向右求值1。这两种方法都引入一个序列点(即,在计算右手操作数之前,将计算左手操作数,并应用所有副作用)

两个运算符都短路-如果
| |
的左操作数计算结果为非零,则表达式的结果为1(true),而不管右操作数的值如何,因此根本不计算右操作数。如果
&&
的左操作数为0,则无论右操作数的值是多少,表达式的结果都为0(false),因此不计算右操作数

在表达式中,首先计算
a
。它有一个非零值(1),因此不计算
–b&&–c


  • 以及
    ?:
    和逗号运算符。所有其他运算符(算术、等式、下标等)不强制执行特定的求值顺序。

    如果您自己编写表达式,请使用括号:
    d=(a | |(-b&&c))
    d=((a | |--b)和&--c)和/或临时变量:
    tmp=--b&&--c;d=a | | tmp第一个会产生相同的结果。第二个是正确的。我知道我可以这样写,我的问题是为什么第一个表达式的结果与第二个表达式的结果不一样?如果
    a
    为真,那么在第一个语句中,既不计算
    --b
    也不计算
    --c
    ,整个表达式的值为真;在第二条语句中,
    --b
    不求值,
    --c
    求值确定整个表达式的值。然后,编译器不能首先求值,因为这个序列点,rhs包含'and'运算符?因此,如果这是正确的,那么求值顺序可能会像本例中那样影响优先级?(或优先级保持不变,但计算结果除了优先级之外也会发生变化)@Crazy_39365:
    |
    &
    强制从左向右求值(与C中的大多数运算符不同)。优先级仅影响操作数与运算符的分组方式。