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