C++2011程序中的一些未定義行為總結:
(1)對于帶符號的整型來說,賦值或者計算結果超過了范圍,將是未定義行為
(2)對于內置類型變量來說,當其定義在原函數外未初始化時,會默認初始化為一個特定的值;對于函數內定義的變量而未初始化時,該變量將是未定義的行為
(3)指針的值一般有四種:指向某一個對象;指向緊鄰對象所占空間的下一個位置;空指針,nullptr,NULL或者0;無效指針。當訪問或者拷貝無效指針的時候,將是未定義行為
(4)求值順序問題:運算符的優先級確定運算符的執行順序,也即運算對象的組合方式;結合律表明了同一優先級的情況下運算對象的組合順序;對于求值順序,當某一運算符的幾個對象均指向并修改某一對象時,編譯器的計算順序將是不可預知的,即運算對象的求值順序與優先級以及結合律無關,下面的兩種情況有可能產生未定義行為:
int i=0; cout<<i<<" "<<++i<<endl;
int i= f()*g();
(5)算術運算時,除數是0時,以及計算結果超出了類型的范圍,算術表達式均會產生未定義行為,得到一個不確定的值。
(6)對于string以及vector對象中的下標運算符,要確保下標在有效范圍內,即在處理遍歷string以及vector對象中的元素時的for( auto ; index != s.size() ; );
(7)對于求值順序而言,當一個表達式中一個子表達式改變了某一個對象,而另一個子表達式又要使用該對象時,編譯器將產生未定義行為,即求值順序的不確定性
(8)對于指針而言,可以定義而不初始化也是合法的,但是訪問或者拷貝一個沒有初始化的指針,或者沒有指向任何對象的指針將是不安全的行為,對于空指針nullptr或者0呢?
解引用無效指針,解引用空指針?
(9)位運算中的左移操作,假如運算對象是帶符號的,此時可能對符號有影響,而對符號位的操作依賴于具體的機器,這是一種未定義行為,所以位運算只作用于無符號整型。
(10)
新聞熱點
疑難解答
圖片精選