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]; |
確認索引在 0 到 n - 1 |
| 有號整數溢位 | int x = 2000000000 + 2000000000; |
估算運算過程最大/最小值,必要時用 long long |
| 整數除以 0 或取餘 0 | x / y、x % y,但 y == 0 |
運算前確認除數不是 0 |
| 同一運算式中多次修改同一變數 | int x = i + ++i; |
把修改拆成多行,讓順序清楚 |
完整速查可參考 附錄 J:Level 0 常見未定義行為速查表。