在 C/C++ 程式設計中,常會遇到一個令人困惑的現象:當整數字面值以 0 開頭時(例如 012),編譯器會將其解釋為八進制而非十進制。這到底是為什麼?背後有什麼歷史緣由與語言規範?
C 語言標準(ISO C90 及後續版本)明確規定了整數字面值的進制判斷規則:
0x 或 0X 開頭 → 十六進制(Hexadecimal)0 開頭 → 八進制(Octal)這是一項從早期 Unix 與 C 語言設計沿襲至今的約定俗成規則,目的是為了讓程式碼能直觀表達不同進制的數值,無需額外關鍵字。
早期計算機系統(如 PDP-11)常以 8 位元組為單位操作資料,八進制可將三個二進制位完美對應一個八進制數字,極大簡化了位元操作與記憶體位址的閱讀。設計者因此決定:單獨一個 0 開頭即代表八進制,既節省字元又符合當時硬體習慣。
| 字面值 | 進制 | 十進制值 |
|---|---|---|
012 | 八進制 | 10 |
12 | 十進制 | 12 |
0x12 | 十六進制 | 18 |
新手最容易犯的錯誤是為了對齊程式碼而在數字前補 0(如 int month = 09;),這會導致編譯錯誤,因為 9 不是合法的八進制數字。建議:
0755 // file permission)0o 前綴(如 0o12)明確表達八進制,提升可讀性「以 0 開頭即八進制」是 C 語言為了歷史相容與硬體映射便利而制定的語法規則。理解此規則能避免莫名其妙的數值錯誤,也是從初學者邁向資深工程師的基礎功課之一。