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:
bool
types的bool
是true
或false
。 以本标准中描述的方式使用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
或!a
或a || b
a || b
将始终以C或C ++返回0或1,而不pipea
和b
的types如何。