以下代码:
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
吗?
答案 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*b
和c-d
必须在评估+
之前进行评估。这不是任何语法或优先级或关联规则,而仅仅是因为在知道其操作数的值之前不可能弄清楚+
的值。但请注意,优先级并不会告诉我们首先评估a*b
和c-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)
<
在==