[英]Is C/C++ bool type always guaranteed to be 0 or 1 when typecast'ed to int?
許多編譯器似乎只在 bool 值中保留 0 或 1,但我不確定這是否總是有效:
int a = 2;
bool b = a;
int c = 3 + b; // 4 or 5?
是的:
在 C++(第 4.5/4 節)中:
bool 類型的右值可以轉換為 int 類型的右值,false 變為 0,true 變為 1。
在 C 中,當一個值轉換為_Bool
,它會變成 0 或 1(第 6.3.1.2/1 節):
當任何標量值轉換為_Bool 時,如果值比較等於0,則結果為0; 否則,結果為 1。
轉換為int
,它非常簡單。 int
可以保存 0 和 1,因此值沒有變化(第 6.3.1.3 節)。
嗯,並不總是...
const int n = 100;
bool b[n];
for (int i = 0; i < n; ++i)
{
int x = b[i];
if (x & ~1)
{
std::cout << x << ' ';
}
}
我的系統上的輸出:
28 255 34 148 92 192 119 46 165 192 119 232 26 195 119 44 255 34 96 157 192 119
8 47 78 192 119 41 78 192 119 8 250 64 2 194 205 146 124 192 73 64 4 255 34 56 2
55 34 224 255 34 148 92 192 119 80 40 190 119 255 255 255 255 41 78 192 119 66 7
8 192 119 192 73 64 240 255 34 25 74 64 192 73 64
這種明顯奇怪的輸出的原因在標准 3.9.1 §6 中列出:
bool
類型的bool
是true
或false
。 以本國際標准描述為“未定義”的方式使用bool
值,例如通過檢查未初始化的自動對象的值,可能會導致它表現為既不是true
也不是false
。
是 C/C++ ......
沒有名為 C/C++ 的語言。
當類型轉換為 int 時,bool 類型總是保證為 0 或 1?
在 C++ 中是的,因為第 $4.5/4 節說
bool 類型的右值可以轉換為 int 類型的右值,false 變為 0,true 變為 1。
.
int c = 3 + b;
// 4 還是 5?
c 的值將是 4
當您離開安全船時,再舉一個例子:
bool b = false;
*(reinterpret_cast<char*>(&b)) = 0xFF;
int from_bool = b;
cout << from_bool << " is " << (b ? "true" : "false");
輸出(g++(GCC)4.4.7):
255 is true
要添加到FredOverflow 的示例中。
C99 之前的 C 中沒有 bool 類型(例如 C90),但是 C99/C++ 中的 bool 類型始終保證為 0 或 1。
在 C 中,無論是否定義了 bool 類型,所有布爾運算都保證返回 0 或 1。
所以a && b
或!a
或a || b
a || b
將總是在C或C的類型的返回0或1 ++不管a
和b
。
如果填充位不包含該類型的預期值,則帶有填充位的類型的行為可能會很奇怪。 大多數 C89 實現不使用任何整數類型的填充位,但 C99 要求實現定義這樣的類型: _Bool
。 當所有位為零時讀取_Bool
將產生零。 將任何非零值寫入_Bool
會將其位設置為某種模式,讀取時將產生 1。 寫入零會將位設置為模式(可能是也可能不是全位為零),讀取時將產生 0。
除非在實現的文檔中另有說明,否則通過將零或非零值存儲到_Bool
無法產生的所有位為零以外的任何位模式都是陷阱表示; 標准沒有說明如果嘗試讀取這樣的值會發生什么。 給定,例如
union boolChar { _Bool b; unsigned char c; } bc;
將零存儲到bc.c
並讀取bc.b
將產生零。 存儲零或一個bc.b
將設置bc.c
到值,如果寫的,會造成bc.b
持有0或1。 將任何其他值存儲到bc.c
並讀取bc.b
將產生未定義的行為。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.