联合会始终具有默认值为零吗?

dat*_*ili 1 c++

请让我们考虑以下代码:

#include <iostream>
using namespace std;

union{
 int i;
}u;

int main(){

     int k=5;
     cout<<k+u.i<<endl;

    system("PAUSE");
    return EXIT_SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)

该代码向我显示输出5,这对我来说意味着,联合结构中的变量i具有默认值= 0,但是ideone.com上的同一代码显示了这样的警告

prog.cpp:6: warning: non-local variable ‘<anonymous union> u’ uses anonymous type and then prints  5 as well, and last one  core of this problem comes  from algorithm calculate  
Run Code Online (Sandbox Code Playgroud)

平方根的倒数,这里是代码

#include<iostream>
#include<math.h>
using namespace std;

float invsqrt(float x){

    float xhalf=0.5f*x;

    union{
         float x;
         int i;
    }u;

   u.x=x;
   u.i=0x5f3759df-(u.i>>1);
   x=u.x*(1.5f-xhalf*u.x*u.x);

   return x;
}

int main(){

    float  x=234;
    cout<<invsqrt(x)<<endl;

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

它也向我显示了输出,但是我的问题是,这段代码是否好?我的意思是因为int我没有进行最后处理,所以任何编译器都可以认为它的值为零吗?我的问题不清楚我说的是我不是英语为母语的人。

Dav*_*nan 5

联合会始终具有默认值为零吗?

语言标准说:

如果未明确初始化具有静态或线程存储持续时间的对象,则:

  • 如果具有指针类型,则将其初始化为空指针;
  • 如果具有算术类型,则将其初始化为(正数或无符号)零;
  • 如果是聚合,则根据这些规则初始化(递归)每个成员,并将任何填充初始化为零位;
  • 如果是联合,则根据这些规则初始化(递归)第一个命名成员,并将任何填充初始化为零位;

因此,在您的第一个代码示例中,u.i将被初始化为零。

我完全不确定第二个代码示例。我看不到union那里的意义。我宁可怀疑您是要使用struct而不是union。但请注意,这两个代码示例非常不同,因为union第一个具有静态存储持续时间,第二个union具有自动存储持续时间。这导致未初始化变量的语义完全不同。