語法書 / AA 競程語法書 上冊 / 第六單元 / 未定義行為(Undefined Behavior, UB)

6.8 未定義行為(Undefined Behavior, UB)

到這裡,你已經看過幾種「程式可以編譯、但結果完全不能信」的情況:局部變數或局部陣列沒有初始化、陣列索引超出範圍、整數溢位、除數是 0,或是在同一個運算式中多次修改同一個變數。

在 C++ 裡,這類語言標準沒有規定結果的寫法,正式名稱叫做未定義行為(undefined behavior, UB)。一旦程式踩到 UB,結果就不能預測:可能印出垃圾值、可能直接當掉,也可能在你的電腦上看起來正常,送到 OJ 或換個編譯器就錯。

Level 0 常見情況 例子 避免方式
局部變數或局部陣列未初始化就使用 int x; cout << x;int a[10]; cout << a[0]; 宣告時給初值,例如 int x = 0;int a[10] = {};
陣列越界 int a[5]; cout << a[5]; 確認索引在 0n - 1
有號整數溢位 int x = 2000000000 + 2000000000; 估算運算過程最大/最小值,必要時用 long long
整數除以 0 或取餘 0 x / yx % y,但 y == 0 運算前確認除數不是 0
同一運算式中多次修改同一變數 int x = i + ++i; 把修改拆成多行,讓順序清楚

完整速查可參考 附錄 J:Level 0 常見未定義行為速查表