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

时间:2011-02-21 13:46:06

标签: c gcc

我在执行以下简单的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

为什么会这样?

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:2)

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

答案 2 :(得分:0)

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