如何在 C 联合中声明变量?

How to declare variables in C unions?

我刚开始接触 C,我正在先阅读 C。根据那本书,我定义了一个联合并尝试在其中声明变量。但是它没有给出预期的 output.Here 是代码

#include <stdio.h>

typedef union{
    short count;
    float weight;
    float volume;
} quantity;

int main()
{
    quantity q;
    q.count = 4;
    q.weight = 1.7;
    q.volume = 3.7;
    
    printf("count = %i\tweight = %.2f\tvolume = %2.f\t", q.count, q.weight, q.volume);
}

这是输出

count = -13107    weight = 3.70    volume = 3.70

为什么我得到的计数是负数而重量和体积是相同的浮点数?

一个union allows to store different data types in the same memory location. You can define a union with many members, but only one member can contain a value at any given time. That is why only the last element you initialized is printed correctly. What you might be looking for is a struct.

typedef struct {
    short count;
    float weight;
    float volume;
} quantity;

A union 为其每个成员共享内存,因此它一次只能存储其中一个成员。如果您写给一位成员并阅读另一位成员,您会得到其他东西。

如果您希望能够同时保存所有这些值,您需要 struct

typedef struct {
    short count;
    float weight;
    float volume;
} quantity;

您一定错过了教科书中的部分,该部分说联合体的所有成员 共享 完全相同的内存,并且所有成员的值将是值上次分配给成员时使用的内存位模式

由于您最后设置了 volume 成员,因此所有成员都将具有与 float 值相同的内存位模式 3.7

并且整数和浮点值在内存中具有不同的位模式,因此 count 的值看起来几乎是随机的或垃圾。

如果您想要三个不同且独立的成员,您需要一个结构而不是联合。

联合是 C 中可用的一种特殊数据类型,它允许将不同的数据类型存储在同一内存位置。您可以定义一个包含许多成员的联合,但在任何给定时间只有一个成员可以包含一个值。

所以如果你想在所有三个变量中存储值,那么你应该使用结构。

typedef struct {
     short count;
     float weight;
     float volume;
}