【发布时间】:2013-08-16 09:42:39
【问题描述】:
我对运算符的优先级感到困惑,想知道如何评估此语句。
# include <stdio.h>
int main()
{
int k=35;
printf("%d %d %d",k==35,k=50,k>40);
return 0;
}
这里k 最初的值为35,当我在printf 中测试k 时,我认为:
-
k>40应该被选中,结果应该是 0 -
k==35应该被选中,结果应该是 1 - 最后 50 应该分配给
k并且应该输出 50
所以最终输出应该是1 50 0,但输出是0 50 1。
【问题讨论】:
-
这是
undefined行为的一个例子 -
运算符优先级在这里无关紧要。
-
在 gcc 版本 4.4.3 上它是
0 50 0因为它是未定义的行为:( -
运算符优先级控制运算符的分组方式,但不控制它们的执行顺序 - 它控制评估什么,但不控制何时。
-
@H2CO3 虽然未指定函数参数的求值顺序,但我相信这种特定情况也是未定义的行为,因为
k在 seq.点用于确定要存储的值以外的其他目的。 C99 6.5/2:Between the previous and next sequence point an object shall have its stored value modified at most once by the evaluation of an expression. Furthermore, the prior value shall be read only to determine the value to be stored.
标签: c operators operator-precedence