C++ 为什么自动变量的默认值是0而不是1?

C++ 为什么自动变量的默认值是0而不是1?,c++,variables,c++11,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; } 为什么不将其设置为垃圾值而不是零?这是未定义行为的结果吗?在Ubuntu 14.04上使用g

考虑代码片段:

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;
}

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

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

实际上,如果一个变量位于处理器寄存器中,那么它将包含一些垃圾值,即它的前一个值;如果它位于调用堆栈的插槽中,则该位置的前一个值可能是0或其他值

详细信息是特定于实现的,并且会因编译器、运行和优化标志的不同而有所不同


阅读,尤其是Lattner的博客:。这是一个特定于编译器和选项的效果

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


您无意中说对了,对于呈现的代码,0结果是“未定义行为的结果”。但这只是因为使用int类型的不确定值是未定义的行为,或者至少在C++11之前是这样。访问三种基本字符类型之一的不确定值是否为UB还不清楚:有一些关于它和DR的缺陷报告,C++14的措辞与C++11及更早版本不同,似乎已经将UB的规范转移到了标准的其他部分。

0是一个完全有效的垃圾编号,在任何情况下,这都是未定义的行为,如果您的实现想要打印foobar,它可以打印foobar。如果使用-O3编译,则很难用数字打印foobar,您可能会得到不同的结果
0
0.000000
0