C 中 'or' 和 'and' 运算符的优先级
Precedence of 'or' and 'and' operators in 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;
}
计算的优先级和顺序是两个不同的东西。来自 逻辑或
文档(强调我的):
There is a sequence point after the evaluation of lhs. If the result of lhs compares unequal to zero, then rhs is not evaluated at all (so-called short-circuit evaluation).
在 exp1 || exp2
的情况下,总是首先评估 exp1
,因为它后面有一个序列点,如果 exp1
是 non-zero,则 exp2
不评价。
优先级仅决定哪些操作数与哪些运算符分组 - 它不控制表达式的计算顺序。
在您的示例中,这意味着表达式被解析为
a || (––b && ––c)
||
和&&
都强制left-to-right评估1。两者都引入了一个序列点(IOW,将评估左手操作数,并在评估右手操作数之前应用所有副作用)。
两个运算符 short-circuit - 如果 ||
的左操作数的计算结果为 non-zero,则表达式的结果为 1 ( true) 不管右操作数的值如何,所以根本不计算右操作数。如果 &&
的左操作数为 0,则无论右操作数的值如何,表达式的结果都是 0(假),因此根本不会计算右操作数。
在您的表达式中,首先计算 a
。它有一个 non-zero 值 (1),因此 ––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;
}
计算的优先级和顺序是两个不同的东西。来自 逻辑或 文档(强调我的):
There is a sequence point after the evaluation of lhs. If the result of lhs compares unequal to zero, then rhs is not evaluated at all (so-called short-circuit evaluation).
在 exp1 || exp2
的情况下,总是首先评估 exp1
,因为它后面有一个序列点,如果 exp1
是 non-zero,则 exp2
不评价。
优先级仅决定哪些操作数与哪些运算符分组 - 它不控制表达式的计算顺序。
在您的示例中,这意味着表达式被解析为
a || (––b && ––c)
||
和&&
都强制left-to-right评估1。两者都引入了一个序列点(IOW,将评估左手操作数,并在评估右手操作数之前应用所有副作用)。
两个运算符 short-circuit - 如果 ||
的左操作数的计算结果为 non-zero,则表达式的结果为 1 ( true) 不管右操作数的值如何,所以根本不计算右操作数。如果 &&
的左操作数为 0,则无论右操作数的值如何,表达式的结果都是 0(假),因此根本不会计算右操作数。
在您的表达式中,首先计算 a
。它有一个 non-zero 值 (1),因此 ––b && ––c
未计算。
- 连同
?:
和逗号运算符。所有其他运算符(算术、相等、下标等)不强制执行特定的评估顺序。