Postfix和前缀运算符作为函数参数 – 为什么会发生这种情况?

我在执行以下简单的c程序时遇到了一个非常有趣的事实:

#include int main( ) { int k=0; printf("%d%d%d", k++, k, ++k); return 0; } 

在Windows中它显示输出为:1 1 1

但是在linux(ubuntu)中,它显示为:1 2 2

为什么会这样?

这是未定义的行为。 当没有/不明确的序列点时。 查看此维基百科文章:

http://en.wikipedia.org/wiki/Sequence_point

有两个问题。 首先,没有指定评估printf调用中表达式k++k++k的顺序; 编译器可以按照它认为合适的任何顺序自由评估它们。 其次,通过表达式的评估,对象可能不会在序列点之间多次更新其存储值。 k++++k试图更新存储在k的值,并且这些表达式之间没有序列点,因此行为是未定义的; 任何结果都是允许的。

该标准未指定评估例程参数的顺序。 编写依赖于排序的代码是不可移植的。