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

析构函数

我知道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?,答案是否定的,简单明了。

顺便说一句,你可能会发现,你测试的三个“独立”环境CodeBlocksDevC++并且ideone,都使用相同的被窝里编译器,所以它决不会是在这种情况下,一个详尽的测试。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

C++ 编译器是否会自动为超出范围的局部变量使用 std::move 构造函数?

C#编译器-未分配的字段和局部变量初始值

现代 C++ 编译器会优化掉错误的 constexpr 条件吗?

现代编译器是否优化仅引用对象子集的局部变量?

现代C ++:初始化constexpr表

C Keil编译器将malloc用于局部变量,为什么?

如何坚持C编译器将局部变量放在堆栈上,而不是在寄存器中

C ++是否会自动将整数初始化为零?

为什么VS Compiler不能在C ++上自动初始化局部变量?

Visual Studio C ++编译器在局部变量对象上的异常行为

现代的C / C ++编译器能否使用标头中的代码更好地优化?

使用()或{}在现代C ++(C ++ 11及更高版本)中正确初始化变量?

使用现代编译器编译的C ++项目,但与过时的libstdc ++链接

默认情况下,C 中未初始化的局部变量是静态的吗?

C#编译器会优化掉变量吗?

现代C ++可以免费为您提供性能吗?

没有unique_ptr的现代C ++构建器模式

位计数:预处理器魔术与现代C ++

将常数双精度映射为整数的现代C ++方法

将iVars放在“现代” Objective-C中的哪里?

现代C ++编译器是否优化了对类的同一数据成员的重复访问?

编译器如何在C中将数组初始化为零?

何时在C中初始化局部变量?

未初始化的局部变量,c ++ 11默认

未初始化的局部变量c4700

使用C ++的未初始化局部变量

C++ 中未初始化的局部变量

为什么C和C ++编译器将显式初始化和默认初始化的全局变量放在不同的段中?

使用列表初始化时,C ++语言是否会强制执行编译器优化?