C中“或”和“与”运算符的优先级

时间:2019-05-27 11:08:06

标签: c logical-operators ansi

在下面的代码中,我得到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;
}

2 个答案:

答案 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不会被评估。


  1. ?:和逗号运算符一起使用。所有其他运算符(算术,等式,下标等)均不强制执行特定的评估顺序。