对于以下代码:
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 中阅读了以下文字:
Since the operator
<
enjoys a higher priority compared to==
,b < d++
is evaluated first and thena == c++
.
现在根据这个,d
的值不应该是成为6
而不是 c
?
最佳答案
假设您在上下文中正确引用了这本书的文本是错误的。
在a == c++ && b < d++
, 表达式被分组为 (a == c++) && (b < d++)
由于语法规则。但是,事物分组的优先级并不能完全确定它们的求值顺序。1
优先级是一个编译时属性,它告诉我们表达式的结构。求值是一种运行时行为,它告诉我们表达式是如何计算的。
1 优先级部分决定了求值顺序,因为运算符的操作数必须在运算符被求值之前求值。例如,在 (a*b)+(c-d)
中, a*b
和 c-d
必须在 +
之前评估可以评估。这不是根据任何语法规则、优先级或关联规则,而仅仅是因为不可能计算出 +
的值。直到你知道它的操作数的值。但请注意,优先级并没有告诉我们 a*b
中的哪一个和 c-d
首先评估,即使*
优先级高于 -
.
关于c - 优先级是否使 < 在 == 之前执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21606372/