请让我们考虑以下代码:
#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我没有进行最后处理,所以任何编译器都可以认为它的值为零吗?我的问题不清楚我说的是我不是英语为母语的人。
联合会始终具有默认值为零吗?
语言标准说:
如果未明确初始化具有静态或线程存储持续时间的对象,则:
- 如果具有指针类型,则将其初始化为空指针;
- 如果具有算术类型,则将其初始化为(正数或无符号)零;
- 如果是聚合,则根据这些规则初始化(递归)每个成员,并将任何填充初始化为零位;
- 如果是联合,则根据这些规则初始化(递归)第一个命名成员,并将任何填充初始化为零位;
因此,在您的第一个代码示例中,u.i
将被初始化为零。
我完全不确定第二个代码示例。我看不到union
那里的意义。我宁可怀疑您是要使用struct
而不是union
。但请注意,这两个代码示例非常不同,因为union
第一个具有静态存储持续时间,第二个union
具有自动存储持续时间。这导致未初始化变量的语义完全不同。
归档时间: |
|
查看次数: |
3504 次 |
最近记录: |