C 语言中"or"和"and"运算符的优先级



在下面的代码中,我得到 10 | 1 | 1 结果。但是根据优先规则,不应该首先评估"和"运算符吗?(产量 c=9)像 : d = a ||(--b)&&(--c),因为"和"具有更高的优先级。(或快捷方式中断优先规则?提前谢谢。

#include <stdio.h>
#include <stdlib.h>
int main(){
int a,b,c,d;
a =1;
b = c = 10;
d = a|| --b&&--c;
printf("%dn",c);
printf("%dn",a);
printf("%dn",d);
return 0;
}

优先级和评估顺序是两个不同的东西。从逻辑或 文档(强调我的):

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

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

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

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

a || (––b && ––c)

||&&都强制从左到右评估1. 两者都引入了一个序列点(IOW,将评估左侧操作数,并且在评估右侧操作数之前将应用所有副作用)。

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

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


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

相关内容

  • 没有找到相关文章

最新更新