1

我知道 C 和 C++ 中的局部变量不会自动初始化,如果没有给它们初始值,它们就有垃圾值。我也知道全局和静态变量默认初始化为零。在 C++ 中使用未初始化的变量会导致未定义的行为。

但是最近我尝试在 C++ 的各种实现上遵循简单的 C++ 程序,所有的结果都给我 0 作为输出。

#include <iostream>
int main()
{
    int u;
    std::cout<<u<<'\n';
}

输出:

代码块 13.12 IDE:0

奥威尔开发 C++ 5.8.3:0

Ideone.com:0(访问:http: //ideone.com/zWrgwo

现代编译器是否会自动将局部变量初始化为 0?还是这种类型的程序仍然代表未定义的行为?是否保证在每个现代 C++ 实现中总是看到 0 作为输出?

4

3 回答 3

3

不,这不是真的。将变量初始化为零会导致不必要的性能成本。非静态变量未初始化为零。

在 C++ 中使用未初始化变量的行为是未定义的。

您可能会发现调试配置对变量进行了零初始化。我发现这特别有害,并且始终确保关闭任何执行此操作的编译器选项。

于 2015-06-02T13:06:51.227 回答
3

具体的实现可以不将它们(“局部”变量)设置为任何值,或者将它们设置为它们想要的任何值,包括零。毕竟,该标准并不要求将它们设置为非零值:-)

该标准仅声明它们的值,如果没有明确设置,是未定义的。因此,它不是一个好的程序员会依赖的东西。这包括在C++11 8.5 Initializers [dcl.init] /11(我的重点):

如果没有为对象指定初始化器,则该对象是默认初始化的;如果不执行初始化,则具有自动或动态存储持续时间的对象具有不确定的值。

因此,在回答您的结束问题时is it guaranteed to see 0 as output on every modern implementation of C++ always?,答案是否定的,简单明了。

顺便说一句,您很可能会发现您在 、CodeBlocksDevC++上测试的三个“独立”环境ideone都在后台使用相同的编译器,因此在这种情况下很难进行详尽的测试。

于 2015-06-02T13:08:50.090 回答
0

最近的 Windows 版本(可能还有其他操作系统)在程序启动时将所有未初始化的内存初始化为 0。

因此,所有“未初始化”的变量都将显示为 0。

但是,这取决于操作系统,而不是编译器。在 Windows 9x(没有此功能)下运行此类程序时,变量具有随机值。

一旦堆栈被使用,堆栈上的变量将包含随机值:

void test()
{
    int a;
    std::cout << a;
}

int main()
{
    someLargeFunction();
    test();
}

变量“a”的值现在取决于函数“someLargeFunction”!

于 2015-06-02T13:28:29.610 回答