现代C ++编译器是否自动将局部变量初始化为0?

时间:2015-06-02 13:05:14

标签: c++ variables variable-initialization

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

但是最近我尝试在C ++的各种实现上遵循简单的C ++程序。 all给出了0作为输出。

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

输出:

CodeBlocks 13.12 IDE:0

Orwell Dev C ++ 5.8.3:0

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

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

3 个答案:

答案 0 :(得分:3)

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

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

您可能会发现调试配置零初始化变量。我发现这种情况特别有害,并且始终确保执行此操作的所有编译器选项都已关闭。

答案 1 :(得分:3)

具体实现可以自由地将它们(&#34;本地&#34;变量)设置为任何东西,或者将它们设置为他们想要的任何值,包括零。毕竟标准并没有强制要求将它们设置为非零值: - )

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

  

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

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

顺便说一句,你可能会发现三个&#34;分开&#34;您测试过的环境CodeBlocksDevC++ideone都在使用相同的编译器,所以它几乎不是一个详尽的测试情况下。

答案 2 :(得分:0)

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

因此,所有&#34;未初始化&#34;变量将显示为0.

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

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

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

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

变量的值&#34; a&#34;现在取决于函数&#34; someLargeFunction&#34;!