这个问题已经有了答案:
Why are these constructs using pre and post-increment undefined behavior?
14个答案

#include <stdio.h>
int main(void) {
        int i=1;
        printf("%d %d\n", i+=1, i);
        printf("%d %d\n", i, i+=1);
        return 0;
}

上面的代码显示了linux和mac的不同输出。
在Linux中:(GCC版本4.9.2 20150212(Red Hat 4.9.2-6))
2 2
3 3

在Mac中:(Apple LLVM 7.0.0版(Clang-700.0.57.2))
2 2
2 3

在linux中,我尝试使用c11、c99、c89。但输出是一样的。所以我不认为这是C标准问题。
为什么会有这种行为?
哪一个是正确的,为什么?

最佳答案

参数以未定义的顺序计算,因此i+=1可以在i之前或之后发生。
这是未定义的,因为堆栈上元素的顺序可能不同,导致某些具有一个调用约定顺序的编译器比另一个调用约定顺序的编译器慢。
这是一个可接受的标准,因为另一个标准(将代码分隔如下)可以提高可读性(没有不确定性)。

 int i = 1, tmp1, tmp2;
 i+= 1;
 tmp1 = i;
 tmp2 = i;
 printf("%d %d\n", tmp1, tmp2 );
 tmp1 = i;
 i += 1;
 tmp2 = i;
 printf("%d %d\n", tmp1, tmp2 );

09-04 00:58