至少在2018的今天,c++的函式引數求值順序仍然是未定的(交給編譯器處理),所以函式引數求值的順序可能在某些情況下回導致一些問題。看下面這個例子:
int test=5;
printf( "%d,%d,%d\n",++test,test,test++);
test=5;
printf( "%d,%d,%d\n",test++,test,++test);
test=5;
printf( "%d,%d,%d\n",test,test++,++test);
test=5;
printf( "%d,%d,%d\n",test,++test,test++);
如果實參運算順序不定,那麼列印結果也是不定的。但好在現代編譯器有自己的解決辦法,gcc編譯器下的列印結果:
7,7,5
6,7,7
7,6,7
7,7,5
得到的結論是:
1.每次列印確實是老老實實按從左到右的順序列印;
2.讀引數按從右到左讀,讀到的同時會計算表示式的值(注意右結合的++運算返回計算之前的值),然後入棧;
3.至少在2018的今天,c++的函式引數求值順序仍然是未定的(交給編譯器處理),
以第乙個為例作詳細解釋(again,注意右結合的++運算返回計算之前的值):
首先從右往左,第乙個讀到的是test++
此時返回的是5(但test這個變數的值已經被修改為6),入棧;第二個讀到的是++test
,這是返回值是加一以後的test,也就是7,入棧;最後乙個test
沒有運算,直接讀
所以最後從左到右最後讀到的是7,7,5
這篇文章裡有更技術性的說明。
這個例子是想說明,在比較常見的gcc編譯器下的編譯策略,以及,提醒各位還是小心這類問題。
tbc…
C 常見陷阱
注 char型別在標準中是個特別的存在,它沒有被規定為有符號或無符號。比如int指的是有符號,而char不一樣。在程式設計時最好給char寫上符號,否則同樣的表示式可能在不同的編譯器 平台會有不同的結果。請觀察乙個程式輸出 int main 輸出 fffffff1,fffffff2,f0f2 fff...
C陷阱篇之常見手誤
c的某些語法容易讓人不小心觸雷,比如 從0開始的下標 很多高階語言中,定義n個元素的陣列,下標範圍是從1到n,但c特殊,n元素的c陣列中沒有下標為n的元素,只有從0到n 1的下標。所以使用c陣列時不要犯這種錯誤 int i,a 10 for i 1 i 10 i i 10時超出陣列邊界 八進位制or...
C陷阱篇之常見手誤
c的某些語法容易讓人不小心觸雷 很多高階語言中,定義n個元素的陣列,下標範圍是從1到n,但c特殊,n元素的c陣列中沒有下標為n的元素,只有從0到n 1的下標。所以使用c陣列時不要犯這種錯誤 int i,a 10 for i 1 i 10 i i 10時超出陣列邊界 八進位制or十進位制常數 c編譯器...