在c ++中使用Unions时不理解输出

chh*_*ing 1 c++ unions

我不太明白以下代码的输出

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.

Dav*_*rtz 6

您的代码有错误.该标准规定,如果您从您写入的最后一个以外的任何工会成员中读取,则结果未指定.如果你修改代码并遵守标准,那么这个谜团就会消失.

最有可能的是,编译器正在优化联合,只使用两个寄存器.

请参阅6.2.6.1或J.1节,其中指出"未存储的最后一个工会成员的值"未指定,并且可能返回任何不会导致陷阱的值.

  • 你应该把手放在空中.我知道你不会喜欢听,但这就是你所能做的.如果该功能是您的,请修复它.如果它不是你的,那就折腾吧. (4认同)

Dan*_*her 5

如果我更精确地打印值,我会得到

12.000000000000122569
Run Code Online (Sandbox Code Playgroud)

对于f.bf.a = 69.

除了未定义的行为之外,可能发生的情况是设置f.a仅更改有效数字的最低有效位(sizeof(int)可能是sizeof(double)4,8),因此您得到的值接近12.0您最初设置的值,并且差异对于标准打印而言太小展示它.