在cpp中使用union的未定义bhaviour?

BSa*_*nke 0 c++ unions

我正在使用c ++进行联合,以下是代码片段:

#include<iostream>
using namespace std;

typedef union myunion
{
  double PI;
  int B;
}MYUNION;

int main()
{
  MYUNION numbers;
  numbers.PI = 3;
  numbers.B = 50;
  cout <<" numbers.PI :" << numbers.PI << endl;
  if(numbers.PI == 3.0)
  {
      cout <<"True";
    if(numbers.B == 50)
    {
      cout <<" numbers.PI :" << numbers.PI << endl;
       cout <<" numbers.B :" << numbers.B << endl;
    }
  }

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出是:

 numbers.PI :3
Run Code Online (Sandbox Code Playgroud)

甚至number.PI的值已经设置为3,首先"if"条件产生为false.这种行为的原因是什么?

小智 5

原因是没有理由.

您的代码调用未定义的行为,因为您正在设置Bunion 的成员:

numbers.B = 50;
Run Code Online (Sandbox Code Playgroud)

但在设置之后,您立即读出其他成员 PI:

cout <<" numbers.PI :" << numbers.PI << endl;
Run Code Online (Sandbox Code Playgroud)

也许你混淆了工会和结构 - 除非浮点数3和整数50在你的架构上具有相同的位表示(这是非常不可能的),你期望从程序中获得的行为只有在你使用的时候才是合理的struct.

(union成员驻留在内存中的相同位置 - 设置一个也会覆盖另一个.对于a struct,每个成员都存储在不同的内存位置,这不是真的.)