我在执行以下简单的c程序时遇到了一个非常有趣的事实:
#include<stdio.h>
int main( )
{
int k=0;
printf("%d%d%d", k++, k, ++k);
return 0;
}
在Windows中显示输出为:1 1 1
但在linux(ubuntu)中显示为:1 2 2
为什么会这样?
答案 0 :(得分:2)
这是未定义的行为。当没有/不明确的序列点时。请参阅此维基百科文章:
答案 1 :(得分:2)
有两个问题。首先,未指定评估k++
调用中的表达式k
,++k
和printf
的顺序;编译器可以按照它认为合适的任何顺序自由评估它们。其次,通过表达式的评估,对象可能不会在序列点之间多次更新其存储值。 k++
和++k
都尝试更新存储在k
的值,并且这些表达式之间没有序列点,因此行为未定义; 允许任何结果。
答案 2 :(得分:0)
标准没有指定评估例程参数的顺序。 编写依赖于排序的代码是不可移植的。