联合声明中对象的值有什么问题?

问题描述 投票:0回答:1

运行以下代码时,我希望 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 embedded
1个回答
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
的字节。

© www.soinside.com 2019 - 2024. All rights reserved.