字面值與常數
當你在程式碼裡直接寫下一個數字或一段文字時,你是把它明明白白地寫出來——這就是字面值。「int x = 42;」裡的 42、計算中的 3.14、表示單一字元的 'A'、以及引號裡的 "hello",都是字面值:直接拼寫進原始碼的固定值。常數則是更廣的概念,指一個不變的值,而 C 提供了好幾種為它命名的方式。
字面值有對應各型別的風味:整數字面值如 42(以及十六進位的 0x2A、八進位的 052,搭配像 U 表無號、L 表 long 的後綴)、浮點字面值如 3.14 或 1.5e-3、字元字面值如 'A'(它其實是一個握著該字元碼的 int)、以及字串字面值如 "hello"(一個以隱藏的字串結尾字元收尾的字元陣列)。要為常數命名,你可以寫一個 const 變數如「const int MAX = 100;」,或用列舉定義一組具名整數常數:「enum Color { RED, GREEN, BLUE };」會自動讓 RED 等於 0、GREEN 等於 1、BLUE 等於 2。前置處理器的 #define 也能做出常數,但那是在編譯前處理的文字替換,另行說明。
為什麼重要:為常數命名、而不是把裸數字(所謂的魔術數字)散落各處,能讓程式碼可讀、且只需在一處更改。列舉對一份固定的選項清單——星期幾、錯誤碼、狀態——特別有價值,因為名字記錄了意圖、編譯器也能幫上忙。一個小提醒:字串字面值必須當成唯讀;試圖修改字串字面值的字元是未定義行為。
int n = 42; /* 整數字面值 */ double r = 1.5e-3; /* 浮點字面值 */ char c = 'A'; /* 字元字面值(一個 int 碼) */ const int MAX = 100; /* 一個具名常數 */ enum Color { RED, GREEN, BLUE }; /* RED==0、GREEN==1、BLUE==2 */
每個字面值都帶有型別。列舉從 0 開始自動為其名稱編號,給出可讀的常數而非裸數字。
字串字面值存在於唯讀記憶體;透過它寫入(例如修改 "hello" 的某個字元)是未定義行為。在 C 中,像 'A' 的字元字面值型別是 int,不是 char。