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
为什么会这样?
这是未定义的行为。 当没有/不明确的序列点时。 查看此维基百科文章:
有两个问题。 首先,没有指定评估printf
调用中表达式k++
, k
和++k
的顺序; 编译器可以按照它认为合适的任何顺序自由评估它们。 其次,通过表达式的评估,对象可能不会在序列点之间多次更新其存储值。 k++
和++k
试图更新存储在k
的值,并且这些表达式之间没有序列点,因此行为是未定义的; 任何结果都是允许的。
该标准未指定评估例程参数的顺序。 编写依赖于排序的代码是不可移植的。