下面的代码在Code :: Blocks上编译和运行时显示不同的结果。初学者关于C程序的查询函数调用堆栈,序列点(排序)
void sum(int a,int b){
printf("a=%d b=%d\n",a,b);
}
int main(){
int i=1;
sum(i=5,++i);
printf("i=%d\n\n",i);
/***********************/
i=2;
sum(i=5,i++);
printf("i=%d\n\n",i);
/**********************/
i=3;
sum(i=5,i);
printf("i=%d\n\n",i);
return 0;
}
输出:
a=5 b=5
i=5
a=5 b=2
i=5
a=5 b=5
i=5
我认为这个问题的答案关系到序列点,并在此++运算符的序列点有关。 GCC必须按照命令传递值以固定顺序堆栈,但由于++的不同,答案不同。我觉得对于初学者来说这样写一个函数调用并不常见,但关于运算符的教训是一般的,所以可以尝试。
我的问题是,它的确切答案和像这样的问题应该是什么?在编译的哪个阶段,这些事情是决定的(明确或不清楚)?涉及哪种特定的算法(用于优化或一般)?相同的编译器能否为这种表达式或语句提供不同的结果最后一个问题是,初学者将如何理解和解决这些问题?有时非常令人惊讶。
可能的重复[为什么这些构造(使用++)未定义的行为?](http://stackoverflow.com/questions/949433/why-are-these-constructs-using-undefined-behavior) – Olaf
逗号在'sum(i = 5,++ i)中;'不是序列点,它分离函数参数。教训是,如果你想使用从单个变量派生的不同值,例如使用'sum(i + 5,i + 1)'并在之后更新'i'。或者在这种情况下,只需'sum(5,i + 1)'。除了别的,还不清楚你打算把“我”的最终价值是什么。是'5'还是'6'或'2'? –
是的,这是更好的写作方式。 – skyconfusion