这个问题可能看起来很幼稚(见鬼,我认为是),但我找不到让我满意的答案。
以这个简单的 C++ 程序为例:
#include<iostream>
using namespace std;
int main ()
{
bool b;
cout << b;
return 0;
}
编译和执行时,它总是打印0
.
问题是这不是我期望它做的:据我所知,局部变量没有初始化值,我相信随机字节有更多不同的机会而不是等于0
.
我错过了什么?
这是未定义的行为,因为您使用的是未初始化变量的值。您不能期望程序具有未定义的行为。
特别是,在初始化from的参数时,您的程序需要进行所谓的左值到右值转换。C++11 标准的第 4.1/1 段规定:operator <<
b
非函数、非数组类型的 glvalue (3.10)
T
可以转换为纯右值。如果T
是不完整类型,则需要进行此转换的程序格式错误。如果泛左值所引用的对象不是类型对象,T
也不是派生自 的类型的对象T
,或者如果该对象未初始化,则需要此转换的程序具有未定义的行为。如果T
是非类类型,则纯右值的类型cv
是T
. 否则,纯右值的类型是T
。
行为未定义;不需要为它分配一个随机值,当然也不是一个均匀分布的值。
可能发生的情况是分配给进程的内存由操作系统初始化为零,这是第一次使用该字节,因此它仍然包含零。
但是,就像所有未定义的行为一样,您不能依赖它,并且没有必要推测细节。
正如安迪所说,这是未定义的行为。我认为你很幸运并且总是收到 0 的事实是实现定义的。程序启动时,堆栈可能是空且干净的(用零初始化)。因此,当在那里分配变量时,您会得到零。
这可以保证在您当前的实现中成功(正如其他人所说,它可能用零初始化堆栈),但也保证在 Visual C++ 调试构建(将局部变量初始化为 0xCCCCCCCC)中失败。
C++ 静态和全局变量默认初始化为 C89 和 C99 所说的 - 特别是算术变量初始化为 0。
自动变量在indeterminate
C89 和 C99 中3.17.2
表示它们要么是未指定的值,要么是陷阱表示。bool 类型上下文中的陷阱表示可能意味着 0 - 这是编译器特定的。