c - C中的短路和运算符优先级

标签 c operators logical-operators operator-precedence short-circuiting

我知道 C 中的逻辑运算符遵循短路,但我怀疑短路和运算符优先级规则并不相互对立。请参阅以下示例:

#include<stdio.h>
int main()
{
    int a;
    int b=5;

    a=0 && --b;
    printf("%d %d",a,b);

    return 0;
}

根据优先级规则,最高优先级是前缀运算符。所以--b应该首先评估,然后是 &&最后结果将分配给 a .所以预期输出应该是 0 4 .但在这种情况下,&& 的第二个操作数从未真正执行,结果是 0 5 .

为什么这里没有应用优先规则。逻辑运算符是否不受优先规则的约束?如果是,还有哪些其他运营商表现出这种行为?这种行为背后的逻辑是什么?

最佳答案

您将两个相关但不同的主题混为一谈:运算符优先级和计算顺序。

运算符优先级规则规定了如何将各种运算符组合在一起。在这个表达式的情况下:

 a=0 && --b;

运算符分组如下:
 a = (0 && (--b));

然而,这对操作数的计算顺序没有影响。 &&运算符特别规定首先计算左操作数,如果计算结果为 0,则不计算右操作数。

所以在这种情况下 && 的左侧这是 0被评估,并且因为它是 0 右侧是 --b不被评估,所以 b不递增。

这是运算符优先级和计算顺序之间差异的另一个示例。
int val()
{
    static x = 2;
    x *= 2;
    return x;
}

int main()
{
    int result = val() + (5 * val());
    printf("%d\n", result);
    return 0;
}

上面的程序会打印什么?事实证明,有两种可能性,而且都是有效的。

在这个表达式中:
val() + (5 * val())

没有任何运算符具有任何类型的短路行为。因此编译器可以自由地评估 + 的各个操作数。和 *以任何顺序。

如果val()的第一个实例首先评估,结果将是 4 + ( 5 * 8) == 44 .如果 val() 的第二个实例首先评估,结果将是 8 + (5 * 4) == 28 .同样,两者都是有效的,因为可以以任何顺序评估操作数。

关于c - C中的短路和运算符优先级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61750969/

相关文章:

c - 如何在 C 中使用指针获取多维数组的输入并打印数组?

angular - 合并两个 rxjs 流并仅在第一个为真时发出

php - 设置默认值(条件赋值)

JavaScript 的控制流构造 : browser specific or inherent to JS

C编程,如何递归获取目录和子目录中的文件

c - 测量执行时间

c - 我的二维数组多了一个元素

swift - 在非可选变量上应用 Nil-Coalescing 运算符时,它不会触发任何错误

c# - 为什么 x++-+-++x 合法但 x+++-+++x 不合法?

c++ - for循环中的多个条件用于Cpp中的单个循环