考虑代码段:
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
进行了编译。
答案 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。