优先级是否<在==之前执行?

时间:2014-02-06 15:01:14

标签: c

以下代码:

int main()
{
    int a, b, c, d;
    c = 5;
    d = 5;
    a = 10;
    b = 8;
    if (a == c++ && b < d++);
    printf("c=%d d=%d\n", c, d);
    return 0;
}

输出:c=6 d=5

我知道,因为if语句中的第一个表达式求值为false,所以不计算第二个表达式,因此输出。但是,我在Balaguruswamy的ANSI C中读到了以下文字:

  

由于与<相比,运营商==享有更高的优先级,b < d++   先评估,然后评估a == c++

现在根据这个,d的价值不应该变成6而不是c吗?

6 个答案:

答案 0 :(得分:4)

NO。如果引用该书对于这个特定的问题那么这本书是错的(我的建议是变得更好:我会建议C primer plus)。逻辑&&||运算符始终从左到右进行求值。在这种情况下,b < d++未被评估为a == c++false(因为逻辑&&运算符的短路行为)。 d根本没有增加,它仍然等于5

答案 1 :(得分:4)

本书的内容是错误的,假设你在上下文中正确引用它。

a == c++ && b < d++中,由于语法规则,表达式被分组为(a == c++) && (b < d++)。但是,事物分组的优先级并不能完全确定它们的评估顺序。 1

Precedence是一个编译时属性,它告诉我们表达式是如何构造的。评估是一种运行时行为,告诉我们如何计算表达式。


1 优先级部分决定评估顺序,因为必须在运算符之前评估运算符的操作数。例如,(a*b)+(c-d)a*bc-d必须在评估+之前进行评估。这不是任何语法或优先级或关联规则,而仅仅是因为在知道其操作数的值之前不可能弄清楚+的值。但请注意,优先级并不会告诉我们首先评估a*bc-d中的哪一个,即使*的优先级高于-

答案 2 :(得分:2)

false && anything总是false,所以当左手已经false时,检查右侧是多余的。这就是为什么只有a增加而d保持初始值的原因。


编辑:这本书错了。

答案 3 :(得分:2)

  

由于运营商&lt;与==,b <1相比,享有更高的优先级。首先评估d ++,然后评估== c ++。

但由于这些运营商不是彼此相邻使用,因此它们的相对优先级并不重要。

首先评估

a == c++,并且只有在评估为true(即!= 0)时才会评估b < d++表达式。

答案 4 :(得分:0)

我认为你遇到的问题是d ++没有被执行。它被称为逻辑运算符短路 - &gt;基本上,正确的表达式永远不会被执行。

查看this link了解详情。

答案 5 :(得分:-3)

<==

之前执行

Precedence table