我不太了解以下代码的输出
union foo
{
int a;
double b;
};
int main()
{
foo f;
f.b = 12.0;
cout << f.b << endl;
f.a = 69;
cout << f.b << endl;
cout << f.a << endl;
return 0;
}
为什么要打印 12 12 69
如果我没弄错的话,第二个12应该是垃圾。我正在使用Visual Studio 2010。
答案 0 :(得分:6)
您的代码有错误。该标准规定,如果您从您写入的最后一个以外的任何工会成员中读取,则结果未指定。如果你修改代码并遵守标准,那么这个谜团就会消失。
最有可能的是,编译器正在优化联合,只使用两个寄存器。
参见6.2.6.1或J.1节,其中规定“未存在的最后一个工会成员的价值”未指定,并且可能返回任何不会导致陷阱的值。
答案 1 :(得分:5)
如果我以更精确的方式打印值,我会得到
12.000000000000122569
f.b
之后的f.a = 69
。
除了未定义的行为之外,可能发生的是设置f.a
仅更改有效数字的最低有效位(sizeof(int)
可能是4,sizeof(double)
8),因此您获得一个值这是接近您最初设置的12.0
,并且差异对于标准打印而言太小而无法显示。