10.2 因為在 C 語言中所有的非零值都被看作 ``真", 是不是把 TRUE  定義為 1 很危險?如果某個內置的函數或關係操作符 ``返回" 不是 1 的 其它值怎麼辦?

C 語言中的確任何非零值都都被看作真, 但這僅限於 ``輸入", 也就是說, 僅限於需要布爾值的地方。內建操作符生成布爾值時, 可以保證為 1 或 0。 因此, 這樣的測試
    if((a == b) == TRUE)
能如願運行 (只要 TRUE 為 1), 但顯然這很傻。 事實上, 跟 TRUE 和 FALSE 的 跟 TRUE 和 FALSE 的 顯示比較都不合適, 因為有些庫函數 (如 isupper(), isalpha() 等) 在成功時返 回非零值, 但不一定為1。 (再說, 如果你認為 ``if((a == b) == TRUE)" 比 ``if(a == b)" 好, 為什麼就此打住呢?為什麼不使用 ``if(((a == b) == TRUE) == TRUE)" 呢?) 一般規則是只在向布爾變量賦值或 函數參數中才使用 TRUE 和 FALSE (或類似的東西), 或者用於函數的返回值, 但決不用於比較。

預處理宏 TRUE 和 FALSE (當然還有 NULL) 只是用於增加代碼可讀性, 而不是因為其 值可能改變。(參見問題 5.3 和 5.8。)

儘管使用 TRUE 和 FALSE 這樣的宏 (或者 YES 和 NO) 看上去更清楚, 布爾值和 定義在 C 語言中的複雜性讓很多程序員覺得 TRUE 和 FALSE 宏不過更令人迷惑, 因而更喜歡使用 1 和 0。 參見問題 5.7

參考資料: [K&R1, Sec. 2.6 p. 39, Sec. 2.7 p. 41]; [K&R2, Sec. 2.6 p. 42, Sec. 2.7 p. 44, Sec. A7.4.7 p. 204, Sec. A7.9 p. 206]; [ISO, Sec. 6.3.3.3, Sec. 6.3.8, Sec. 6.3.9, Sec. 6.3.13, Sec. 6.3.14, Sec. 6.3.15, Sec. 6.6.4.1, Sec. 6.6.5]; [H&S, Sec. 7.5.4 pp. 196-7, Sec. 7.6.4 pp. 207-8, Sec. 7.6.5 pp. 208-9, Sec. 7.7 pp. 217-8, Sec. 7.8 pp. 218-9, Sec. 8.5 pp. 238-9, Sec. 8.6 pp. 241-4]; ``What the Tortoise Said to Achilles"。

翻譯朱群英、孫雲, LaTeX2HTML 編譯 朱群英 (2005-06-23)