天天看點

C語言undefined behaviour未定義行為

 C語言中的未定義行為(Undefined Behavior)是指C語言标準未做規定的行為。同時,标準也從沒要求編譯器判斷未定義行為,是以這些行為有編譯器自行處理,在不同的編譯器可能會産生不同的結果,又或者如果程式調用未定義的行為,可能會成功編譯,甚至一開始運作時沒有錯誤,隻會在另一個系統上,甚至是在另一個日期運作失敗。當一個未定義行為的執行個體發生時,正如語言标準所說,“什麼事情都可能發生”,也許什麼都沒有發生。

 

1.同一運算符中多個操作數的計算順序(&&、||、?和,運算符除外)

  例如:x = f()+g(); //錯誤

  f()和g()誰先計算由編譯器決定,如果函數f或g改變了另一個函數所使用變量的值,那麼x的結果可能依賴于這兩個函數的計算順序。

參考: 《C程式設計語言(第2版)》 P43

2.函數各參數的求值順序

  例如: printf(“%d,%d\n”,++n,power(2,n)); //錯誤

  在不同的編譯器可能産生不同的結果,這取決于n的自增運算和power調用誰在前誰在後。

需要注意的是,不要和逗号表達式弄混,都好表達式可以參考這篇文章:c語言中逗号運算符和逗号表達式

參考: 《C程式設計語言(第2版)》 P43

3.通過指針直接修改 const 常量的值

  直接通過指派修改const變量的值,編譯器會報錯,但通過指針修改則不會,例如:

  

int main()
{
    const int a = ;
    int *b = (int*)&a;
    *b = ;

    printf("%d, %d", a, *b);
    return ;
}
           

a輸出值也由編譯器決定。

轉載位址:http://www.itoldme.net/archives/904

繼續閱讀