在下面的代码中,我得到10 | 1 |结果为1。但是根据优先级规则,不应该首先对'and'运算符进行求值吗?(得出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("%d\n",c);
printf("%d\n",a);
printf("%d\n",d);
return 0;
}
答案 0 :(得分:4)
评估的优先级和顺序是两个不同的事物。来自Logical OR 文档(重点是我):
lhs评估后有一个序列点。如果lhs的结果不等于零,则根本不评估rhs(所谓的短路评估)。
在exp1 || exp2
的情况下,始终先评估exp1
,因为它后面有一个序列点;如果exp1
不为零,则不评估exp2
。
答案 1 :(得分:2)
优先级仅确定将哪些操作数与哪些运算符组合在一起-它不控制表达式的求值顺序。
在您的示例中,这意味着表达式被解析为
a || (––b && ––c)
||
和&&
都强制从左到右求值 1 。两者都引入了序列点(IOW,将评估左操作数,并且在评估右操作数之前将应用所有副作用)。
两个运算符短路-如果||
的左操作数求值为非零,则表达式的结果为1(true),而与右运算符的值无关操作数,因此根本不评估正确的操作数。如果&&
的左操作数为0,则表达式的结果为0(假),而不管右操作数的值如何,因此完全不评估右操作数。
在您的表达式中,a
首先被求值。它的值非零(1),因此––b && ––c
不会被评估。
?:
和逗号运算符一起使用。所有其他运算符(算术,等式,下标等)均不强制执行特定的评估顺序。