首页 > 编程笔记 > C语言笔记 阅读:25

C语言enum枚举的用法(附带实例)

在 C语言中,枚举(enumeration)是一种用户自定义的数据类型,允许你为一组有名字的整数常量定义符号名。枚举也是一种方便且易于阅读的方法,用于表示一组相关的整数值,例如表示状态、错误代码等。

我们可以用有意义的英文单词来替代数字,这些英文单词可以自由命名,只要我们能够理解它们对应的类型即可。例如,我们可以将 1 表示的整型替换为 eInteger,将 2 表示的浮点数替换为 eFloat,将 3 表示的字符串替换为 eString。

枚举的定义使用关键字 enum,后跟枚举类型的名称以及由花括号括起来的枚举值列表,最后以分号结束。例如:
enum msgType{
   eInteger,
   eFloat,
   eString
};

为什么说枚举是一种特殊的整型呢?让我们用输出整型的方式来输出这几个枚举类型,具体代码如下:
#include <stdio.h>
enum msgType {
    eInteger,
    eFloat,
    eString
};
int main()
{
   printf("eInteger %d\n", eInteger);
   printf("eFloat %d\n", eFloat);
   printf("eString %d\n", eString);
   return 0;
}
运行结果为:

eInteger 0
eFloat 1
eString 2

我们发现 eInteger 的值为 0,eFloat 的值为 1,eString 的值为 2。这是因为枚举会从 0 开始,依次递增。

我们如果希望从 1 开始编号,则可以在 eInteger 后添加 =1,例如:
enum msgType{
   eInteger = 1,  //  让枚举从1开始
   eFloat,
   eString
};
这样枚举就能够从 1 开始了,运行结果为:

eInteger 1
eFloat 2
eString 3


更特殊的是,你可以为枚举中的每个成员指定一个值,例如:
enum msgType{
    eInteger = 1,
    eFloat = 3,
    eString = 5
};
现在,我们可以使用枚举替代数字,对前面的信息类型判别的程序进行修改,完整代码如下:
#include <stdio.h>
enum msgType {
    eInteger,
    eFloat,
    eString
};

struct message {
    enum msgType type;
    union {
        int n;
        float f;
        char* str;
    };
};

void printMsg(struct message msg)
{
    switch (msg.type)
    {
    case eInteger:
        printf("%d\n", msg.n);
        break;
    case eFloat:
        printf("%f\n", msg.f);
        break;
    case eString:
        printf("%s\n", msg.str);
        break;
    }
}

int main()
{
    struct message msg[3];
    // 第一条信息为整型,type 为 eInteger
    msg[0].type = eInteger;
    msg[0].n = 123;
    // 第二条信息为浮点型,type 为 eFloat
    msg[1].type = eFloat;
    msg[1].f = 3.14159;
    // 第三条信息为字符串,type 为 eString
    msg[2].type = eString;
    msg[2].str = "HelloWorld";
    for (int i = 0; i < 3; i++)
    {
        printMsg(msg[i]);
    }
    return 0;
}
运行结果为:

123
3.141590
HelloWorld

在这段修改后的代码中,我们使用了枚举类型 enum msgType 来代替数字表示消息的类型。通过在枚举中定义有意义的符号名来表示不同的消息类型,代码变得更易于阅读和理解。

同时,我们在上面的实例程序中使用了类型定义,将枚举类型定义为 msgType。这样,在后续代码中,我们可以直接使用 msgType 来代表消息类型,这增加了代码的可读性。

相关文章