_Bool 與 void
C 語言有兩個型別因其代表的意義而特殊:一個是是/否的答案,另一個是什麼都沒有。_Bool 是真假值的型別——它只能是 true 或 false。void 則代表「這裡沒有值」,用來表示某函式不回傳任何東西,或宣告某函式不接受任何引數。
_Bool 是在 1999 年加入 C 的。它以 0 表示假、1 表示真;把任何非零值指派給它都會得到 1。如果你引入標頭檔 stdbool.h,就能使用較友善的寫法 bool、true、false,它們只是對應到 _Bool、1、0。void 在日常出現於三種角色:作為回傳型別,「void f(void)」表示 f 不回傳任何東西;作為參數列,裡面的 void 表示 f 完全不接受任何參數;而你無法宣告型別為 void 的變數,因為沒有值可存。(另一個獨立的構造「void 指標」是不同的概念,在他處說明——它是指向未知型別位元組的指標,不是一個 void 值。)
為什麼重要:在 _Bool 出現之前,C 程式設計師用普通的 int 配 0 與 1 來假裝布林值,這雖然可行,卻隱藏了意圖,也讓雜亂的值有機可乘。_Bool 明確記錄某變數是個旗標。void 則讓函式簽章誠實:它讓編譯器檢查你不會去用一個不存在的結果,也不會不小心傳引數給一個本應不收引數的函式。一個常見陷阱:在舊式 C 中,寫「int f()」帶空括號意思是「引數未指定」,而非「沒有引數」——要真正表示沒有引數,請寫「int f(void)」。
#include <stdbool.h> bool is_ready = false; is_ready = true; void greet(void) { /* 不回傳、也不接受任何東西 */ }
bool(來自 stdbool.h)清楚命名一個真假值;void 同時作為回傳型別與參數列,表示 greet 既不回傳也不接受任何東西。
型別 void(沒有值)與 void 指標(指向未知型別的指標)不是同一回事。而舊式宣告中像 int f() 的空括號意思是「引數未指定」,不是「沒有引數」——要表達後者請用 int f(void)。