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

时间:2013-04-04 21:56:49

标签: 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;
}

为什么要打印     12     12     69

如果我没弄错的话,第二个12应该是垃圾。我正在使用Visual Studio 2010。

2 个答案:

答案 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,并且差异对于标准打印而言太小而无法显示。