C 枚举类型

在 C 语言中,枚举类型是一种用户自定义的数据类型,它由一组常量整数值组成。使用枚举类型,可以提高代码的可读性和可维护性。

C 枚举类型语法

在实际开发中,有些变量只有几种可能的取值。比如人的性别只有 2 种值:"男" 和 "女",而星期几只有 7 种值:1、2、3、4、5、6、7。

在 C 语言中,我们可以定义一个变量为枚举类型,然后限制该变量在某个范围内取值。

语法:

enum 类型名 {标识符1, 标识符2, ..., 标识符n};

说明:

每一个标识符的值只能是一个整数类型,而不能是其他类型。另外,大括号后面的分号也不能省略。

C 枚举类型示例

接下来,我们通过几个简单的例子来讲解一下 C 枚举类型是如何使用的。

示例 1:定义 “性别” 枚举类型

#include <stdio.h>

// 定义一个枚举类型
enum Gender { MALE = 0, FEMALE = 1};

int main(void)
{
    // 定义一个枚举变量
    enum Gender iGender;

    printf("请输入一个整数,0 是男,1 是女:");
    int input;
    scanf("%d", &input);
    iGender = input;

    switch (iGender)
    {
        case MALE:
            printf("男生");
            break;
        case FEMALE:
            printf("女生");
            break;
        default: 
            printf("输入错误"); 
            break;
    }
    return 0;
}

运行之后,我们输入 “1”,然后输出结果如下。

女生

分析:

在这个例子中,我们使用 enum 关键字定义了一个名为 Gender 的枚举类型。Gender 类型有 2 种取值情况:0 和 1,其中 0 使用 MALE 代替,1 使用 FEMALE 代替。

有了类型之后,接下来就是使用这个类型去定义一个相应的变量了,这一点和之前介绍的结构体类型是一样的。enum Gender iGender; 表示定义了一个变量 iGender,它的类型是 Gender。对于 iGender 来说,它的值只能是 0 或 1,而不能是其他值。

在定义枚举类型时,我们可以为每一个标识符指定对应的整数。如果只为第一个标识符指定整数,那么后续的标识符的值会依次加 1。下面 2 种方式是等价的。

// 方式 1
enum Gender { MALE = 0, FEMALE = 1};

// 方式 2
enum Gender { MALE = 0, FEMALE};

示例 2:定义 “星期” 枚举类型

#include <stdio.h>

// 定义一个枚举类型
enum Week { MON=1, TUES, WED, THURS, FRI, SAT, SUN};

int main(void)
{
    // 定义一个枚举变量
    enum Week day;

    printf("请输入一个 1~7 之间的整数:");
    int input; 
    scanf("%d", &input);
    day = input;

    switch (day)
    {
        case MON:
            printf("周一");
            break;
        case TUES:
            printf("周二");
            break;
        case WED:
            printf("周三");
            break;
        case THURS:
            printf("周四");
            break;
        case FRI:
            printf("周五");
            break;
        case SAT:
            printf("周六");
            break;
        case SUN:
            printf("周日");
            break;
        default: 
            printf("输入错误"); 
            break;
    }
    return 0;
}

运行之后,我们输入 “3”,然后输出结果如下。

周三

分析:

对于这个例子来说,下面 2 种方式是等价的。

// 方式 1
enum Week { MON=1, TUES, WED, THURS, FRI, SAT, SUN};

// 方式 2
enum Week { MON=1, TUES=2, WED=3, THURS=4, FRI=5, SAT=6, SUN=7};

C 枚举类型的本质

在 C 语言中,枚举类型本质上是整数类型。默认情况下,枚举元素的类型是 int。枚举变量被当作整数变量来处理,它们可以进行比较运算。

对于枚举类型来说,它的标识符相当于常量,小伙伴们还需要注意以下 3 点。

  • 不允许对标识符重新赋值的,比如 MON = 10; 就是错误的。
  • 不允许再定义和这些标识符相同名字的变量。
  • 枚举变量的取值范围是固定的,只能从这些标识符对应的值中去取。

示例 3:枚举的本质是整数

#include <stdio.h>

enum Color { RED, GREEN, BLUE };

int main(void)
{
    enum Color color = GREEN;
    printf("GREEN 的值:%d\n", color);

    if (color == 1)
    {
        printf("color 等于 1\n");
    }

    return 0;
}

运行结果如下。

GREEN 的值:1
color 等于 1

分析:

在这个例子中,RED 的值为 0,GREEN 的值为 1,BLUE 的值为 2。我们可以直接将枚举变量 color 与整数进行比较。

使用 typedef 定义枚举别名

在实际开发中,为了简化枚举类型的使用,我们可以使用 typedef 关键字为枚举类型定义一个别名。

示例 4:使用 typedef 定义枚举别名

#include <stdio.h>

// 为 enum Color 定义别名 Color
typedef enum Color
{
    RED,
    GREEN,
    BLUE
} Color; 

int main(void)
{
    // 可以直接使用 Color 定义枚举变量
    Color myColor = GREEN; 
    printf("%d\n", myColor);

    return 0;
}

运行结果如下。

1

分析:

通过 typedef enum Color { ... } Color;,我们为 enum Color 这个类型定义了一个更简洁的别名 Color。这样后面就可以直接使用 Color 来声明枚举变量,而不需要每次都写 enum Color。

上一篇: C 结构体指针

下一篇: C 联合体

给站长反馈

绿叶网正在不断完善中,小伙伴们如果发现任何问题,还望多多给站长反馈,谢谢!

邮箱:lvyenet@vip.qq.com

「绿叶网」服务号
绿叶网服务号放大
关注服务号,微信也能看教程。
绿叶网服务号