代码之家  ›  专栏  ›  技术社区  ›  mojuba

C/C++ BOOL类型在类型转换为int时总是保证为0还是1?

  •  40
  • mojuba  · 技术社区  · 14 年前

    许多编译器似乎只在bool值中保留0或1,但我不确定这是否总是有效:

    int a = 2;
    bool b = a;
    int c = 3 + b; // 4 or 5?
    
    6 回复  |  直到 6 年前
        1
  •  46
  •   Matthew Flaschen    14 年前

    对:

    在C++中(第4.5或4):

    bool类型的值可以是 转换为int类型的右值, 假变为零和真 成为一个。

    在C中,当值转换为 _Bool ,变为0或1(§6.3.1.2/1):

    当任何标量值转换为 _ bool,如果值比较等于0,则结果为0;否则, 结果是1。

    当转换为 int 很直接。 int 可容纳0和1,因此价值没有变化(§6.3.1.3)。

        2
  •  19
  •   fredoverflow    14 年前

    嗯,不是 总是

    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 或者是 true false . 使用 布尔 以本国际标准所描述的“未定义”的方式表示的值,例如 检查未初始化的自动对象的值,可能会导致该对象的行为如同两者都不是一样。 也不 .

        3
  •  18
  •   Prasoon Saurav    14 年前

    是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

        4
  •  8
  •   Community George Stocker    7 年前

    当你离开安全的船时,还有一个例子:

      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's example .

        5
  •  3
  •   MSalters    14 年前

    C预C99(例如C90)中没有布尔类型,但是C99/C++中的布尔类型总是保证为0或1。

    在C语言中,无论bool类型是否定义,所有布尔操作都保证返回0或1。

    所以 a && b !a a || b 无论C或C++的类型如何,都将返回0或1。 a b .

        6
  •  1
  •   supercat    6 年前

    如果填充位不包含类型所需的值,则带有填充位的类型的行为可能很奇怪。大多数C89实现都没有对任何整数类型使用填充位,但C99要求实现定义这样的类型: _Bool . 阅读 布尔布尔 当它的所有位都为零时,将产生零。将任何非零值写入 小精灵 将其位设置为某个模式,读取时将产生1。写零将把位设置为一个模式(可能是或可能不是所有的位都为零),当读取时将产生0。

    除非在实现文档中另有规定,否则任何位模式(除了所有的位零之外)都不能通过将零值或非零值存储到 布尔布尔 是一个陷阱表示;标准没有说明如果试图读取这样的值会发生什么。给定,例如

    union boolChar { _Bool b; unsigned char c; } bc;
    

    将零存储到 bc.c 和阅读 bc.b 将产生零。将零或一存储到 公元前 将设置 公元前 如果写入,将导致 公元前 保持零或一。将任何其他值存储到 公元前 和阅读 公元前 将产生未定义的行为。