1

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

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。

4

2 回答 2

6

您的代码有错误。该标准规定,如果您从除最后一个成员之外的任何工会成员中读取,则结果未指定。如果你修复代码并遵守标准,谜团就会消失。

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

请参阅第 6.2.6.1 或 J.1 节,其中指出“除了最后一个存储到的联合成员的值”未指定,并且可能返回任何不会导致陷阱的值。

于 2013-04-04T21:59:33.923 回答
5

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

12.000000000000122569

f.b之后f.a = 69。_

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

于 2013-04-04T22:04:43.970 回答