我知道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作为输出?
答案 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;您测试过的环境CodeBlocks
,DevC++
和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;!