使用if语句输出并集

ec1*_*ec1 1 c union if-statement

嘿,我在此C代码上有一个作业问题:

#include<stdio.h>

typedef union{
    char var1;
    int var2;
    float var3;
}data;

int main()
{
    data mydata;

    mydata.var1 = 'B';
    mydata.var2 = 12;

    if(mydata.var1 == 'B')
        mydata.var3 = 3.5;
    else
        mydata.var3 = 7.1;

    printf("%.1f", mydata.var3);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出是7.1,我想知道是否有人可以解释为什么输出是7.1而不是3.5。

为您的帮助加油。

Sau*_*Rai 5

您应该知道的第一件事是union为其所有成员分配一个公共存储空间。我们一次只能访问一个工会成员。

在您的示例中,“ B”被分配给联合成员“ mydata.var1”。内存位置名称为mydata.var1,此位置存储的值为“ B”。然后将12分配给联合成员“ mydata.var2”。现在,内存位置名称为“ mydata.var2”,其值为12。(一次只能容纳一个成员)。这就是在程序中调用else部分的原因。如果要打印3.5而不是7.1,则应使用struct而不是并集,因为该结构会为所有成员分别分配空间。

typedef struct{
    char var1;
    int var2;
    float var3;
}data;

int main()
{
    data mydata;

    mydata.var1 = 'B';
    mydata.var2 = 12;

    if(mydata.var1 == 'B')
        mydata.var3 = 3.5;
    else
        mydata.var3 = 7.1;

    printf("%.1f", mydata.var3);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

希望这会帮助你。