运行以下代码时,我希望 Z 的值也等于 3,就像 x 和 y 一样,因为它是主导变量,但我得到了这个结果:
3
3
4194307
Process returned 0 (0x0) execution time : 0.015 s
Press any key to continue.
代码:
#include <stdio.h>
#include <stdlib.h>
// unions //
union u1 {
char x;
short int y;
int z;
};
int main()
{
union u1 A;
A.x=3;
//A.y=258;
printf("%d\n",A.x);
printf("%d\n",A.y);
printf("%d\n",A.z);
/* A.y=258;
printf("%d\n",A.x);
printf("%d\n",A.y);
printf("%d\n",A.z); */
return 0;
}
C 标准没有为联合定义任何“主导变量”。联合体由具有同等地位的成员组成,但当给出不带成员指示符的值来初始化联合体时,将使用第一个命名的成员。
联合体的成员共享联合体的字节。当值存储在联合成员中时,与该成员不对应的字节将采用未指定的值。 (这意味着它们得到确定的值,但这些值不是由 C 标准指定的,并且在每个存储操作中可能不同。)
因此
A.x=3;
将成员 x
的字节设置为 3,并且可以将其他字节设置为任何值。
在 C 中,当您读取除最后存储的联合成员之外的联合成员时,联合的字节将被重新解释为新成员的类型。 (在 C++ 中,该行为不是由 C++ 标准定义的。)获取
A.y
的值 3 显示不与 A.y
共享的 A.x
字节已设置为 0。
对于
A.z
,您有 4,194,307。以十六进制表示,即 0040000316。这表明剩余两个字节被设置为 0016 和 4016。它还显示您的 C 实现以小端顺序存储 short
和 int
的字节。