布尔变量的初始化

时间:2013-05-31 12:39:09

标签: c++ boolean

这个问题似乎很天真(地狱,我认为是这样),但我找不到满足我的答案。

采用这个简单的C ++程序:

#include<iostream>
using namespace std;
int main ()
{
    bool b;
    cout << b;
    return 0;
}

编译和执行时,总是打印0

问题是我不希望它做的事情:据我所知,局部变量没有初始化值,我相信随机字节有更多的机会不同而不是等于{ {1}}。

我错过了什么?

5 个答案:

答案 0 :(得分:11)

这是未定义的行为,因为您正在使用未初始化变量的值。对于具有未定义行为的程序,您不能指望任何事情。

特别是,当您从operator <<初始化b的参数时,您的程序需要进行所谓的左值到右值转换。 C ++ 11标准的第4.1 / 1段规定:

  

非函数非数组类型T的glvalue(3.10)可以转换为prvalue。如果T不完整   类型,需要这种转换的程序是不正确的。如果glvalue引用的对象不是   类型T的对象,不是从T派生的类型的对象,或者如果对象未初始化,则为程序   这需要转换具有未定义的行为。如果T是非类类型,则prvalue的类型为   cv - T的无限定版本。否则,prvalue的类型为T

答案 1 :(得分:6)

行为未定义;没有要求为它分配一个随机值,当然也不是一个均匀分布的值。

可能发生的情况是,分配给进程的内存是由操作系统零初始化的,这是第一次使用该字节,因此它仍然包含零。

但是,就像所有未定义的行为一样,你不能依赖它,并且对细节的推测毫无意义。

答案 2 :(得分:1)

正如安迪所说,这是未定义的行为。我认为你很幸运并且总是收到0的事实是实现定义的。程序启动时,堆栈可能是空的并且是干净的(用零初始化)。因此,当在那里分配变量时,你会得到零。

答案 3 :(得分:0)

这可以保证在您当前的实现中成功(正如其他人所说,也许它用零初始化堆栈)但是它也保证在Visual C ++调试版本(将局部变量初始化为0xCCCCCCCC)中失败。

答案 4 :(得分:0)

C ++静态和全局变量默认初始化为C89和C99表示 - 特别是算术变量初始化为0。

自动变量为indeterminate,C89和C99在3.17.2表示它们是未指定的值或陷阱表示。在bool类型的上下文中的陷阱表示可能意味着0 - 这是编译器特定的。