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 未计算。


  1. 连同 ?: 和逗号运算符。所有其他运算符(算术、相等、下标等)不强制执行特定的评估顺序。