C++ 常見陷阱之 語法

1.函數參數求值順序

至少在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…

發佈了31 篇原創文章 · 獲贊 12 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章