可能的重复:
未定义的行为和序列点
函数调用顺序
我在使用GCC 4.5.2(x86 32位)编译下面的代码时发现了一个问题。
# include <stdio.h>
int function(int x){
printf("%d\n", x);
return 2*x + 1;
}
int main(){
int x = 3*function(1) + 4*function(2) + 5*function(3) + 6*function(4) + 7*function(5) + 8*function(6);
printf("%d\n", x);
return 0;
}
预期输出:
1
2
3
4
5
6
299
实际 GCC 输出:
1
2
4
3
6
5
299
我用 clang 编译了相同的代码,输出是预期的。
不。未指定调用发生的顺序。它们可以以任何顺序发生,但是对于此处进行的每一对函数调用,一个人将看到另一个的所有副作用,或者没有(即它们不能并行运行,除非它们没有副作用,并且在这个例子他们有一个大副作用,
printf
)。