许多编译器似乎只保留bool值中的0或1,但我不确定这总是有效:
int a = 2;
bool b = a;
int c = 3 + b; // 4 or 5?
答案 0 :(得分:46)
是:
在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)。
答案 1 :(得分: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 << ' ';
}
}
我的系统输出:
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
。以本标准描述的方式将bool
值用作“未定义”,例如通过检查未初始化的自动对象的值,可能会使其表现得好像既不是true
也不是false
。
答案 2 :(得分:18)
是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
答案 3 :(得分:8)
当你离开安全船时还有一个例子:
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
答案 4 :(得分:3)
C pre C99(如C90)中没有bool类型,但C99 / C ++中的bool类型始终保证为0或1。
在C中,无论是否定义了bool类型,所有布尔运算都保证返回0或1。
所以a && b
或!a
或a || b
始终在C或C ++中返回0或1,无论a
和b
的类型如何。
答案 5 :(得分:1)
如果填充位不保存该类型的期望值,则具有填充位的类型的行为可能会很奇怪。大多数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
保持零或一。将任何其他值存储到bc.c
并读取bc.b
会产生未定义的行为。