联合的默认值是否总是为零?
Does a union always have default value of zero?
请考虑以下代码:
#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;
表示x
和i
都被初始化。
一般注意:警告-您似乎期望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),因为大多数处理器本身支持
- 如果输入类型与目标类型不同,"cin"变量是否重置为某个默认值?
- 具有默认值的单个参数构造函数是否与默认构造函数相同?
- const变量是否可以在具有默认值的参数中赋值(作为可选参数)
- 是否有C++准则将第一个枚举设置为"safe"默认值?
- boost::p rogram_options:是否可以将一个选项设置为另一个选项的默认值
- 是否可以在运行时更改C++类的默认值?
- 是否可以将`constexpr`模板变量作为正式模板参数的默认值
- 检查信号处理程序是否不是默认值
- 是否可以设计一个包含模板参数默认值的类
- 是否可以提示用户输入并提供默认值
- 如何确定模板参数是否为默认值
- -std=c++11 编译器标志是否会在某个时候成为默认值
- 如果没有定义Move语义(Move构造函数和Move赋值操作符),编译器是否默认优化
- c++默认初始化是否将数组元素设置为默认值?
- 联合的默认值是否总是为零?
- C++和提升 XML 存档(序列化):是否可以指定元素的标记名称?(默认值:"item" )
- map检查map是否被分配了非默认值
- 如何检查注册表中是否未设置(默认)值
- 将函数指针上的参数与默认值参数一起丢弃是否有效
- 函数的未命名参数是否可以具有默认值