C / C ++布尔types总是保证是0或1时typecast'ed int?

许多编译器似乎只保留0或1在布尔值,但我不知道这将始终工作:

int a = 2; bool b = a; int c = 3 + b; // 4 or 5? 

是:

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

一个booltypes的右值可以被转换成一个inttypes的右值,其中false为零,并且为true。

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

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

当转换为int ,它非常简单。 int可以保持0和1,所以值没有变化(第6.3.1.3节)。

是C / C ++ …….

没有语言叫做C / C ++。

布尔types总是保证是0或1时typecast'ed int?

在C ++是因为部分$ 4.5 / 4说

一个booltypes的右值可以被转换成一个inttypes的右值,其中false值为零,true值为1。

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

c的值将是4

那么,并不总是

 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:

booltypes的booltruefalse 。 以本标准中描述的方式使用bool值作为“未定义”(例如通过检查未初始化的自动对象的值),可能会导致其行为看起来既不true也不true

另外一个例子,当你离开安全船时:

  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的示例中 。

C pre C99(如C90)中没有booltypes,但C99 / C ++中的booltypes始终保证为0或1。

在C中,所有的布尔操作都保证返回0或1,无论booltypes是否定义。

所以a && b!aa || b a || b将始终以C或C ++返回0或1,而不pipeab的types如何。