C 常見陷阱之 語法

2021-08-19 21:43:14 字數 987 閱讀 3575

至少在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編譯器...