为什么自动变量的默认值是0而不是垃圾变量?

时间:2016-06-25 04:55:13

标签: c++ variables c++11

考虑代码段:

int main()  
{
int n;
cout<<n;
float f;
cout.setf(ios_base::fixed,ios_base::floatfield);
cout<<endl<<f;
char ch;
cout<<endl<<static_cast<int>(ch);
return 0;
}

输出:

0
0.000000
0

为什么不将其设置为垃圾值而不是零?这是未定义行为的结果吗?在g++4.8.2上使用Ubuntu 14.04进行了编译。

2 个答案:

答案 0 :(得分:3)

这是一种特定于编译器和选项的效果。

静态变量首先是零初始化。自动局部变量没有这样的保证初始化。但是编译器可以添加零初始化,只是为了“有用”。

你不小心认为,对于提供的代码,0结果是“未定义行为的结果”。但这只是因为使用类型arr = ["A1", "A2", "A3", "A4", "A5", "B1", "B2", "B3", "Z5"] p arr.drop_while {|s| s != "A5" }.drop(1) # => ["B1", "B2", "B3", "Z5"] 的不确定值是未定义的行为,或者至少是UB直到并包括C ++ 11。它是否有点不清楚是否访问三种基本int类型之一的不确定值是UB:有一些关于它的缺陷报告(DR #240#616),以及C ++ 14的措辞与C ++ 11及更早版本不同,似乎已将UB的规范转移到标准的其他部分。

答案 1 :(得分:1)

您应该记住,C ++ 11标准中定义的自动变量没有默认初始值。

实际上,这样的变量将包含一些垃圾值(如果它位于处理器寄存器中,它的前一个值;如果它位于调用堆栈的槽中,那个位置的前一个值)可​​能是0(或其他)。

详细信息是特定于实现的,并且会随编译器,运行和优化标志而变化。

了解undefined behavior,特别是Lattner的博客:What every programmer should know about undefined behavior。真的是他们scared