bool、true、false 成為關鍵字(C23)
/ bool /
C 並非一直都有真正的布林型別;長久以來程式設計師用 int 搭配「0 表示假、非 0 表示真」的慣例。C99 加入了內建布林型別,拼作 _Bool,並在你引入 <stdbool.h> 時提供較友善的名字 bool、true、false(以巨集形式)。C23 完成了這項收尾:bool、true、false 成為語言正式的「關鍵字」,完全不需標頭檔即可使用。
在底層,布林型別只持有值 0 與 1:把任何非零值賦給 bool 會存成 1,賦 0 則存成 0——所以 bool b = 5; 會讓 b 持有 1 而非 5。在 C23 中,true 與 false 是型別為 bool、分別等於 1 與 0 的常數,而關鍵字 bool 就是型別本身(底線前綴的 _Bool 名稱仍存在作為相容用的底層拼法,但你不再需要 <stdbool.h> 才能寫 bool)。這讓 C 更接近 C++,並移除一小塊長期存在的樣板程式碼。
它對清晰度很重要:回傳 bool 的函式遠比回傳 int 的更能說明「是或否」,而該型別的 0/1 正規化避免了比較時的意外。值得說明的提醒:bool 仍是參與整數提升的算術型別,且它與單一位元的儲存不同——sizeof(bool) 至少 1 位元組。此外,先前引入 <stdbool.h> 的程式碼在 C23 中仍能正常編譯;該標頭檔只是變得不再必要。
// C23:不需 #include bool ready = true; bool b = 5; // b 持有 1 而非 5(任何非零值 -> 1) if (ready && !b) { /* ... */ } // sizeof(bool) 至少 1 位元組,而非 1 位元
在 C23 中 bool/true/false 是關鍵字;賦予非零值會正規化為 1,而 bool 仍佔用至少一位元組。
bool 只存 0 或 1(任何非零賦值都變成 1),但仍佔用至少一位元組,且在算術中會提升為 int;引入過 <stdbool.h> 的舊程式碼在 C23 中仍可運作。