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

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

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

输出:

CodeBlocks 13.12 IDE:0

Orwell开发C++ 5.8.3:0

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

现代编译器会自动将局部变量初始化为0吗?还是这类程序仍然代表未定义的行为?是否可以确保始终在每个现代C++实现中将0视为输出?

最佳答案

特定的实现可以自由地不将它们(“局部”变量)设置为任何值,也可以将它们设置为所需的任何值,包括零。毕竟,标准没有要求将它们设置为非零值:-)

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



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

顺便说一句,您可能会发现,您在ozt_code,CodeBlocksDevC++上测试过的三个“分离”环境都在幕后使用了相同的编译器,因此在这种情况下,这几乎不是一个详尽的测试。

关于c++ - 现代C++编译器会自动将局部变量初始化为0吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30596984/

10-11 19:42
查看更多