代码之家  ›  专栏  ›  技术社区  ›  chhenning

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

  •  1
  • chhenning  · 技术社区  · 11 年前

    我不太理解以下代码的输出

    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 回复  |  直到 11 年前
        1
  •  6
  •   David Schwartz    11 年前

    您的代码有一个错误。该标准规定,如果您从上一个写信给的工会成员以外的任何工会成员中读取,则结果是未指定的。如果你修改了代码并遵守了标准,那么这个谜团就会烟消云散。

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

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

        2
  •  5
  •   Daniel Fischer    11 年前

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

    12.000000000000122569
    

    对于 f.b 之后 f.a = 69 .

    撇开未定义的行为不谈,可能发生的是这种情况 f.a 只更改有效位的最低有效位( sizeof(int) 可能是4, sizeof(double) 8) ,所以您得到的值接近 12.0 您最初进行了设置,但差异太小,标准打印无法显示。