我知道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?
,答案是否定的,简单明了。
顺便说一句,你可能会发现,你测试的三个“独立”环境CodeBlocks
,DevC++
并且ideone
,都使用相同的被窝里编译器,所以它决不会是在这种情况下,一个详尽的测试。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句