联合的默认值是否总是为零?

Does a union always have default value of zero?

本文关键字:是否 默认值      更新时间:2023-10-16

请考虑以下代码:

#include <iostream>
using namespace std;
union{
 int i;
}u;
int main(){
     int k=5;
     cout<<k+u.i<<endl;
    system("PAUSE");
    return EXIT_SUCCESS;
}

这段代码显示了我的输出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  

平方根的倒数这里是代码

#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;
}

它也显示了我的输出,但我的问题是,这是一个代码好吗?我的意思是,因为int I没有初始化,任何编译器都可以认为它的值为零吗?我很好奇,请告诉我一些关于这方面的事情,如果我的问题不清楚,请告诉我,我不是英语母语者。

联合的默认值总是0吗?

语言标准是这样说的:

具有静态或线程存储时间的对象未初始化明确,那么:

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

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

我完全不确定第二个代码示例。我看不出union的意义。我相当怀疑你打算用struct而不是union。但请注意,这两个代码示例非常不同,因为第一个示例中的union具有静态存储持续时间,而第二个示例中的union具有自动存储持续时间。这将导致未初始化变量的语义完全不同。

这是初始化联合变量:

union{
  float x;
  int i;
}u;
u.x=x;

表示xi都被初始化。

一般注意:警告-您似乎期望int成员与联合的float成员具有相同的大小。这可能是真的,但不一定。您似乎还假设您的编译器使用某种浮点表示。据我所知,编译器没有这样的义务2

警告:非局部变量' u '使用匿名类型

只是意味着您不应该真正为外部可见的符号使用匿名联合类型。如果您使用-Wall进行编译(所有警告都打开),您也会在本地看到这个警告。

它也显示了我的输出,但我的问题是,这是一个代码好吗?我的意思是,因为int I没有初始化,任何编译器都可以认为它的值为零吗?

就我所看到的代码而言,u.i NOT未初始化。它根据分配u.x的事实进行初始化。这是联合的实际定义:联合将成员字段存储在相同的内存位置。这意味着,即使u.i可能(没有检查)在01自动初始化,那么您将通过分配给u.x

来覆盖它

<子>1(不太可能,因为编译器如何选择是0初始化。i还是。x?)

2尽管在实践中大多数将使用IEEE格式(http://en.wikipedia.org/wiki/IEEE_754),因为大多数处理器本身支持