C/C++ 中 bool 相比於 char 有什麼優勢?為什麼要設立 bool 類型?


《C++語言的設計與演化》,第 11.7.2 節。

簡言之,如果標準不定義bool,程序員就會自己typedef,那麼有的會用char,有的會用unsigned int,有的會用signed int,那就頭大了。

類型名可以是 BOOL/Bool/bool/BOOLEAN/Boolean/boolean 之一;還有同時定義 BOOL 和 BOOLEAN,且類型不同的。

同理,如果語言不定義 true false 關鍵字,有的程序員會define TRUE / FALSE,有的會 define True / False,有的會 define true / false,TRUE 可以是 1 也可以是 -1 ……


C++ 編譯器認為,bool 的實際類型一般是 unsigned char,但是:

bool b1 = some_bool_func1(..);
bool b2 = some_bool_func2(..);
if (b1 == b2) {...} else {...};

這裡面的 if (b1 == b2) 實際上會被編譯成 if (0 == b1 0 == b2 || 0 != b1 0 != b2)

因為,雖然 bool 的法定值是 0 和 1,但實際上 bool 代表的是 0 和 非0,從不可靠來源得到的 bool 值可能是 0~255 中間的任意值


char當bool有什麼不好呢?的確有。比如arm單片機編程,用int當bool,一個寄存器直接就行了。用char的話,需要取得1/4個寄存器,為了判斷bool的值,編譯器就需要加入不少代碼,取寄存器的若干位。增加代碼大小,減少運行速度,沒有得到任何好處。


C 有類型檢查,C的bool就是用宏替換的int沒有類型檢查


語義約束。


C programming language 不在手邊,懶得重新連接代理,說錯了別要怪我

我記得C中沒有bool,是部分編輯器使用 typedef將boolean定義成了 int

Using boolean values in C


別的不知道,首先你不應當拿bool和char比,bool在很多平台都是32位的。

=================

記錯了!只有glib里的是32位的

typedef gint gboolean;


主要是類型統一,這個其他同學都有講到。還有一個就是便於編譯器優化。


Exception C++上有個Item就講到如何正確實現bug free的bool類型 可以參考


推薦閱讀:

二級C習題10.10為什麼選C?
有必要在寫 C++ 時避免隱式轉換嗎?
C++中如何載入100K+的常數數組?
C++自學用書推薦?
自學計算機圖形學要哪些基礎?只用c語言可以嗎?

TAG:編程語言 | C編程語言 | 編譯原理 | CC |