2
#include<stdio.h>
int main()
{
        int i=-1, j=-1, k=-1, l=2, m;
        m = (i++ && j++ && k++) || (l++);
        printf("%d %d %d %d %d", i, j, k, l, m);
}

我对运算符优先级如何在给定程序中的逻辑表达式的评估中起作用感到困惑。

变量m将被分配01取决于它后面的逻辑表达式的值。

将评估第一个括号,两个 AND 操作的总体结果将为 true 或1。但是,由于使用了短路逻辑 OR,因此不会对第二个括号进行评估。

所以,我的问题是,如果括号的优先级高于该表达式中的所有其他运算符,为什么不先评估两个括号,然后执行 OR 操作?也就是说,为什么输出是0 0 0 2 1而不是0 0 0 3 1

编辑:我所问的与这个(建议重复)有些不同,因为我强调括号括住 OR 运算符的第二个操作数。

4

2 回答 2

4

当存在歧义时,运算符优先级生效。

在这种情况下,规范非常明确。

如果任一操作数比较不等于,则运算||符应让步;否则,它会产生. 结果有类型。100int

而且,(强调我的

与按位运算|符不同,运算||符保证从左到右的求值;如果计算第二个操作数,则在第一个和第二个操作数的计算之间存在一个序列点。如果第一个操作数比较不等于0,则不计算第二个操作数。

在你的情况下,

 (i++ && j++ && k++) || (l++);

(i++ && j++ && k++)是左操作数,(l++);是右操作数,其余的应该很清楚。:)

于 2016-10-28T12:13:17.123 回答
2

运算符优先级(和关联性)仅决定应如何解析表达式。将其与操作数的评估顺序混淆是一个常见的错误,这是不同的事情。在此示例中,运算符优先级是相当不相关的。

对于 C 中的大多数运算符,未指定操作数的计算顺序。如果你写了true | l++那么l++就会被处决。“短路评估”是您的代码中不会发生这种情况的原因。运算符是一种特殊情况,&& ||因为它们明确定义了评估顺序。||如果左操作数的计算结果为非零,则保证不计算 的右操作数。

于 2016-10-28T12:57:23.600 回答