运算符优先级如何在此程序中实际运行?

时间:2016-10-28 12:10:37

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

#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

修改: 我提出的问题与this有些不同(建议重复)  因为我正在强调括起OR运算符的第二个操作数的括号。

2 个答案:

答案 0 :(得分:4)

操作员优先权在出现歧义时生效。

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

  

如果||运算符的任何一个操作数与1不相等,则0运算符将产生0;否则,它   收益率int。结果的类型为|

和(强调我的

  

与按位||运算符不同, 0运算符保证从左到右的运算符;如果   评估第二个操作数,在第一个操作数的评估之间有一个序列点   和第二个操作数。如果第一个操作数与 (i++ && j++ && k++) || (l++); 不相等,则第二个操作数为   未评估。

在你的情况下,

(i++ && j++ && k++)

(l++);是左操作数,Name Value --------- ------- Firstname Bob Surname Smith Address1 101 High Street City London Country UK 是右操作数,其余的应该非常清楚。 :)

答案 1 :(得分:2)

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

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