c語言中的未定義行為(undefined behaviour)是指C語言标準未做規定的行為。同時,标準也沒有要求編譯器判斷未定義行為,是以這些行為由編譯器自行處理,在不同的編譯器可能會産生不同的結果,又或者如果程式調用未定義的行為,可能會成功編譯,甚至一開始運作時沒有錯誤,隻會在另一個系統上,甚至是在另一個日期運作失敗。當一個未定義行為的執行個體發生時,正如語言标準所說,“什麼事情都可能發生”。也許什麼都沒有發生。
是以,避免未定義行為,是個明智的決定。本文将介紹幾種未定義行為。
1.同一運算符中多個操作數的計算順序(&&,||,?和,運算符除外)
例如:x=f()+g();//錯誤
f()和g()誰先計算由編譯器決定,如果函數f或g改變了另一個函數所使用變量的值,那麼x的結果可能依賴于這兩個函數的計算順序。
2.函數個參數的求值順序
例如: printf("%d,%d\n",++n,power(2,n));//錯誤
在不同編譯器可能産生不同的結果,這取決與n的自增運算和power調用誰在前誰在後。需要注意的是,不要和逗号表達式弄混。
3.通過指針直接修改const常量的值
直接通過指派修改const變量的值,編譯器會報錯,但通過指針修改則不會,例如:
int main()
{
<span style="white-space:pre"> </span>const int a = 1;
<span style="white-space:pre"> </span>int *b = (int*)&a;
<span style="white-space:pre"> </span>*b = 21;
<span style="white-space:pre"> </span>printf("%d,%d",a,b);
<span style="white-space:pre"> </span>return 0;
}
a輸出值也由編譯器決定。