C 以下代码的输出。。联合

C 以下代码的输出。。联合,c,unions,C,Unions,谁能解释一下为什么下面的代码会打印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; } #包括 int main() { 联合变量 { INTA,b; }; 联合var v; v、 a=10; v、

谁能解释一下为什么下面的代码会打印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;
}
#包括
int main()
{
联合变量
{
INTA,b;
};
联合var v;
v、 a=10;
v、 b=20;
printf(“%d\n”,v.a.);
返回0;
}

根据联合的定义:不能同时使用
v.a
v.b
,因为这两个字段共享相同的地址。引用标准:

并集类型描述了重叠 成员对象的非空集,每个 其中有一个可选指定的 名称和可能的不同类型

在这里,只要分配给
v.b
,就可以覆盖
v.a
。在您的例子中,事情不会变得糟糕,因为这两个变量的类型相同,但是想象一下如果
a
是一个
float
b
一个字符会怎么样


如果您的目标是使
var
成为包含两个不同
int
的复合变量,那么您应该使用
struct
,而不是
union
,根据union的定义:您不能同时使用
v.a
v.b
,因为这两个字段共享相同的地址。引用标准:

并集类型描述了重叠 成员对象的非空集,每个 其中有一个可选指定的 名称和可能的不同类型

在这里,只要分配给
v.b
,就可以覆盖
v.a
。在您的例子中,事情不会变得糟糕,因为这两个变量的类型相同,但是想象一下如果
a
是一个
float
b
一个字符会怎么样


如果您的目标是使
var
成为包含两个不同
int
的复合变量,那么您应该使用
struct
,而不是
union
,union的宽度足以存储它所包含的最宽类型,并且这些类型将共享相同的地址。如果希望
a
b
不同,请使用
struct

根据C99标准第6.7.2.1节:

工会的规模足以容纳其最大的成员。at的价值 大多数成员可以随时存储在联合对象中。指向联合对象的指针 经过适当转换的union对象指向其每个成员(或者如果成员是位- 现场,然后是其所在单位),反之亦然

根据第6.5.8节:

指向同一联合对象成员的所有指针比较相等


联合将足够宽以存储它所包含的最宽类型,并且这些类型将共享相同的地址。如果希望
a
b
不同,请使用
struct

根据C99标准第6.7.2.1节:

工会的规模足以容纳其最大的成员。at的价值 大多数成员可以随时存储在联合对象中。指向联合对象的指针 经过适当转换的union对象指向其每个成员(或者如果成员是位- 现场,然后是其所在单位),反之亦然

根据第6.5.8节:

指向同一联合对象成员的所有指针比较相等


联合是一种提供对不同类型的相同内存的访问的东西。因此,在您的代码中,第一个赋值没有多大意义,因为第二个赋值存在。它会按最后一个顺序影响内存,因此您会得到最后一个赋值。

联合是一种提供对不同类型的相同内存的访问的东西。因此,在您的代码中,第一个赋值没有多大意义,因为第二个赋值存在。它会按最后一个顺序影响内存,因此您会得到最后一个赋值。

在发布之前,您是否阅读了
union
的定义?在发布之前,您是否阅读了
union
的定义?