在对int进行类型转换时,C / C ++ bool类型总是保证为0或1吗?

时间:2010-11-25 10:52:35

标签: c++ c boolean

许多编译器似乎只保留bool值中的0或1,但我不确定这总是有效:

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

6 个答案:

答案 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类型的值可以是truefalse。以本标准描述的方式将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

添加到FredOverflow's example

答案 4 :(得分:3)

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

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

所以a && b!aa || b始终在C或C ++中返回0或1,无论ab的类型如何。

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