变量a由值10赋值,变量b由联合变量v赋值20然后它给出的是20的输出而不是10.我没有得到它。用联合变量分配两个值
#include<stdio.h>
int main()
{
union var
{
int a, b;
};
union var v;
v.a=10;
v.b=20;
printf("%d\n", v.a);
return 0;
}
我执行程序,我得到20作为输出。
变量a由值10赋值,变量b由联合变量v赋值20然后它给出的是20的输出而不是10.我没有得到它。用联合变量分配两个值
#include<stdio.h>
int main()
{
union var
{
int a, b;
};
union var v;
v.a=10;
v.b=20;
printf("%d\n", v.a);
return 0;
}
我执行程序,我得到20作为输出。
union
将所有列出的成员彼此重叠(尽管有些可能会延伸得比重叠的起始部分更远),因此分配给.a
或.b
的内容正在写入相同部分的内存。考虑到这一点,输出应该是合理的。
你可能在想的struct
的行为,如果你期待的10
输出在真正扭曲的情况下,有可能同时有存放在工会的不同值的部分,但一般的部分覆盖价值将被视为腐败。例如,这样的:
union {
char a;
struct { char ba; char bb; } b;
} s;
可以同时存储s.a
和s.b.bb
,但由于s.a
重叠s.b.ba
,在s.b.ba
分配给s.a
单块,并暗示所有的s.b
不再是值得信赖的。
通常用于存储不同类型的工会组织将被嵌入在一个结构,其第一成员记录的联合成员使用:
struct {
int type;
union {
char ch;
int n;
} datum;
} atom;
这里,type
可能会包含一个枚举值指示是否datum.ch
或datum.n
在原子中被使用。
一个union
从struct
区别这两种方式:
int
,工会整体的小型化是int
)union
中。您存储到v
的最后一个值是20
,所以应该打印union
的任何成员时获得的值回。
如果您想要访问两个成员,那么您应该使用struct
来代替。
你应该阅读有关union
:
这将帮助你了解发生了什么 - 基本上是union
的所有成员都存储在相同地址在内存中。
这是一个有启发性的问题。尝试颠倒作业,如下:
v.b=20;
v.a=10;
并查看结果。如果你想a
和b
共存,而不是相互叠加,然后使用一个结构,如下:
#include<stdio.h>
int main()
{
struct var
{
int a, b;
};
struct var v;
v.a=10;
v.b=20;
printf("%d\n", v.a);
return 0;
}
,你应该得到的结果想。但是,var结构现在包含两个整数。
假设,原始的int大小是32位。
C/C++中联合数据类型的概念是:它使我们能够将不同的数据类型存储在同一个内存位置。我们可以定义与许多成员的联盟,但是在任何给定时间只有一个成员可以包含值。联盟的规模足以包含其中最大的成员。
你的情况:'a'&'b'是int类型,所以'var'union的大小是32位。
现在想象大小为32的二进制数组。让我们说A [32]。至少5个有效位存储01010,即分配给'v.a'的10的二进制形式。接下来当你将20赋值给'v.b'时,10100(20的二进制形式)将替换为01010.因此,当前union v在内存空间中有10100个。
当您访问'v.a'时,它将返回该内存位置的当前值。
工会在同一时间,你可以分配一个值。在联合中,这些值彼此重叠。所以你在为两个联合元素赋值时做错了。它将始终显示最后分配的值。所以如果你正在访问一个值,它会显示最后更新的值。
不确定你在问什么;但[Google](https://www.google.com/search?q=c+union)有很多关于C联盟的信息 – 2013-08-19 04:11:18
谢谢@JensGustedt。我删除了误导评论(你只应该阅读最近写的字段) – Himanshu