在对int进行类型转换时,C/C++ bool类型总是保证为0或1吗?

moj*_*uba 44 c c++ boolean

许多编译器似乎只保留bool值中的0或1,但我不确定这将始终有效:

int a = 2;
bool b = a;
int c = 3 + b; // 4 or 5?
Run Code Online (Sandbox Code Playgroud)

Mat*_*hen 48

是:

在C++(§4.5/ 4)中:

bool类型的rvalue可以转换为int类型的rvalue,false变为零,true变为1.

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

当任何标量值转换为_Bool时,如果值比较等于0,则结果为0; 否则,结果为1.

转换到时int,它非常简单. int可以保持0和1,因此值没有变化(§6.3.1.3).

  • 请注意,对于C,它取决于类型`_Bool`.如果您改为使用`typedef enum {false,true} bool;`它不会以这种方式工作. (5认同)

fre*_*low 19

好吧,并不总是 ......

const int n = 100;
bool b[n];
for (int i = 0; i < n; ++i)
{
    int x = b[i];
    if (x & ~1)
    {
        std::cout << x << ' ';
    }
}
Run Code Online (Sandbox Code Playgroud)

我的系统输出:

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
Run Code Online (Sandbox Code Playgroud)

这个看似奇怪的输出的原因在标准3.9.1§6中列出:

类型的值booltruefalse.使用bool本国际标准描述的方式中的值为"未定义",例如通过检查未初始化的自动对象的值,可能会使其表现为既不是也不truefalse.

  • @Sebastian:你错了.其他一些事情,包括终止程序或`system("rm -rf /");如果访问未初始化变量的值,则允许发生`****. (6认同)
  • @hha:注意行`int x = b [i]`,我真的希望这个随机的东西在这里被转换为0或1.不是吗? (4认同)
  • @Sebastian:所以未初始化的变量定义了行为? (3认同)
  • @Sebastian:尝试访问未初始化的变量*是*UB.@FredOverflow:你呢?我没想到任何事情,毕竟是UB.您是否真的认为每次访问布尔值时都应该有一个转换步骤?没有定义的方法可以将"true"或"false"存储到布尔变量中. (3认同)
  • 不,不是真的,数组只是一块非常内存,它可以包含任何内容,如果你做了bool b [n] = {0}那么这是一个不同的故事.但是,您对该标准的引用是有用的信息,所以+ 1用于指出异常 (2认同)
  • 未定义的行为。C++ 或 C 标准不保证适用于未定义的行为。 (2认同)

Pra*_*rav 17

是C/C++ .......

没有名为C/C++的语言.

在类型转换为int时,bool类型总是保证为0或1?

在C++中是的,因为$ 4.5/4节说

bool类型的rvalue可以转换为int类型的rvalue,false变为零,true变为1.

.

int c = 3 + b; // 4或5?

c的值为4

  • -1表示没有称为C/C++的语言.这句话迂回曲折,但故意无益.原来的海报并没有像C/SQL那样提到过.如果你知道C++而不是C标准,那就这么说吧. (33认同)
  • +1表示没有称为C/C++的语言. (25认同)
  • C99在头文件"<stdbool.h>"中定义了一个新类型`_Bool`和一个typedef`bool`.如果你没有`#include <stdbool.h>`,你的程序不能使用`bool`,但是它们可以使用`_Bool`. (5认同)
  • 除了C,C甚至没有bool类型:) (2认同)
  • @hhafez:在C中,直到C99,没有bool数据类型.请举起你的downvote. (2认同)
  • @thb 我不同意这个评论没有帮助。C++ 是具有更多功能的 C 的观点相当普遍。两种语言的标准在很多方面都有所不同,这是一个重要的考虑因素。 (2认同)

Ale*_*Che 8

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

  bool b = false;
  *(reinterpret_cast<char*>(&b)) = 0xFF;
  int from_bool = b;
  cout << from_bool << " is " << (b ? "true" : "false");
Run Code Online (Sandbox Code Playgroud)

输出(g ++(GCC)4.4.7):

  255 is true
Run Code Online (Sandbox Code Playgroud)

要添加到FredOverflow的示例中.