许多编译器似乎只在
0
值中保留 1
或 bool
,但我不确定这是否总是有效:
int a = 2;
bool b = a;
int c = 3 + b; // 4 or 5?
是的:
在 C++ 中(§4.5/4):
bool 类型的右值可以是 转换为 int 类型的右值, false 变为零且 true 成为一体。
在 C 中,当一个值转换为
_Bool
时,它变成 0 或 1 (§6.3.1.2/1):
当任何标量值转换为 _Bool,比较等于0则结果为0;否则, 结果是 1.
转换为
int
时,非常简单。 int
可以保存 0 和 1,因此值没有变化(第 6.3.1.3 节)。
好吧,不是总是...
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
是C/C++吗......
没有名为 C/C++ 的语言。
当类型转换为 int 时,bool 类型始终保证为 0 或 1?
在 C++ 中是的,因为 $4.5/4 节说
bool 类型的右值可以转换为 int 类型的右值,其中 false 变为 0,true 变为 1。
.
// 4 还是 5?int c = 3 + b;
c 的值为 4
当你离开安全船时,还有一个例子:
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 的示例。
C99 之前的 C 语言(例如 C90)中没有 bool 类型,但 C99/C++ 中的 bool 类型始终保证为 0 或 1。
在 C 中,无论是否定义了 bool 类型,所有布尔运算都保证返回 0 或 1。
因此,无论
a && b
和 !a
的类型如何,a || b
或 a
或 b
在 C 或 C++ 中将始终返回 0 或 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
将产生未定义的行为。