下面的代碼在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