簡體   English   中英

當類型轉換為 int 時,C/C++ bool 類型是否總是保證為 0 或 1?

[英]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類型的booltruefalse 以本國際標准描述為“未定義”的方式使用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!aa || b a || b將總是在C或C的類型的返回0或1 ++不管ab

如果填充位不包含該類型的預期值,則帶有填充位的類型的行為可能會很奇怪。 大多數 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM