我不太明白以下代码的输出
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;
}
Run Code Online (Sandbox Code Playgroud)
为什么打印12 12 69
如果我没弄错的话,第二个12应该是垃圾.我正在使用Visual Studio 2010.
您的代码有错误.该标准规定,如果您从您写入的最后一个以外的任何工会成员中读取,则结果未指定.如果你修改代码并遵守标准,那么这个谜团就会消失.
最有可能的是,编译器正在优化联合,只使用两个寄存器.
请参阅6.2.6.1或J.1节,其中指出"未存储的最后一个工会成员的值"未指定,并且可能返回任何不会导致陷阱的值.
如果我更精确地打印值,我会得到
12.000000000000122569
Run Code Online (Sandbox Code Playgroud)
对于f.b后f.a = 69.
除了未定义的行为之外,可能发生的情况是设置f.a仅更改有效数字的最低有效位(sizeof(int)可能是sizeof(double)4,8),因此您得到的值接近12.0您最初设置的值,并且差异对于标准打印而言太小展示它.
| 归档时间: |
|
| 查看次数: |
159 次 |
| 最近记录: |