bool 转换为int 能保证是0还是1吗?

问题描述 投票:0回答:6

许多编译器似乎只在

0
值中保留
1
bool
,但我不确定这是否总是有效:

int a = 2;
bool b = a;
int c = 3 + b; // 4 or 5?
c++ c type-conversion boolean
6个回答
57
投票

是的:

在 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 节)。


22
投票

好吧,不是总是...

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


19
投票

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

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

当类型转换为 int 时,bool 类型始终保证为 0 或 1?

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

bool 类型的右值可以转换为 int 类型的右值,其中 false 变为 0,true 变为 1。

.

int c = 3 + b;
// 4 还是 5?

c 的值为 4


10
投票

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

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


3
投票

C99 之前的 C 语言(例如 C90)中没有 bool 类型,但 C99/C++ 中的 bool 类型始终保证为 0 或 1。

在 C 中,无论是否定义了 bool 类型,所有布尔运算都保证返回 0 或 1。

因此,无论

a && b
!a
的类型如何,
a || b
a
b
在 C 或 C++ 中将始终返回 0 或 1。


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
将产生未定义的行为。

© www.soinside.com 2019 - 2024. All rights reserved.