请让我们考虑以下代码:
#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 没有初始化,任何编译器都可以认为它的值为零吗?我很好奇,请告诉我一些关于这个的信息,如果我的问题不清楚,请告诉我,我的母语不是英语。
联合的默认值是否始终为零?
语言标准是这样说的:
如果具有静态或线程存储持续时间的对象未初始化
明确地,那么:
- 如果是指针类型,则初始化为空指针;
- 如果它是算术类型,则将其初始化为(正或无符号)零;
- 如果它是一个聚合,则根据这些规则(递归地)初始化每个成员,
并且任何填充都被初始化为零位;
- 如果它是联合,则根据这些初始化(递归地)第一个命名成员
规则,并且任何填充都初始化为零位;
因此,在您的第一个代码示例中,u.i
将被初始化为零。
我根本不确定第二个代码示例。我看不出有什么意义union
那里。我相当怀疑你打算使用struct
而不是一个union
。但请注意,这两个代码示例非常不同,因为union
第一个具有静态存储持续时间,第二个具有静态存储持续时间union
具有自动存储期限。这会导致未初始化变量的语义完全不同。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)