[英]C Programming : Confusion between operator precedence
我对运算符的优先级感到困惑,想知道如何评估该语句。
# 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 k
,并应输出50 因此最终输出应为1 50 0
,但输出为0 50 1
。
您不能依赖此程序的输出,因为它是undefined behavior
,未在C中指定评估顺序,因为这使编译器可以根据C99
草案标准第6.5
节第3
段进行更好的优化:
语法表示操作符和操作数的分组。74)除非稍后指定(对于函数调用(),&&,||,?:和逗号运算符), 子表达式的求值顺序和哪种副作用都未指定。
它也是未定义的,因为您正在访问k
的值并在同一sequence point
为其分配sequence point
。 从标准草案第6.5
条第2
款:
在上一个序列点与下一个序列点之间,对象的存储值最多只能通过对表达式的求值来修改。 此外,先验值应只读以确定要存储的值。
它引用了以下未定义的代码示例:
i = ++i + 1;
a[i++] = i;
更新资料
关于函数调用中的逗号是否充当序列点的评论。 如果我们看6.5.17 Comma operator
节, 6.5.17 Comma operator
第2
段会说:
逗号运算符的左操作数被评估为void表达式; 评估后有一个序列点。
但是第3
段说:
示例如语法所示,逗号运算符(如本小节中所述) 不能出现在使用逗号分隔列表中的项(例如函数的参数或初始化器列表 )的上下文中 。
因此,在这种情况下,逗号不会引入序列点。
未指定函数参数的评估顺序。 可以按任何顺序对它们进行评估。 编译器决定。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.