C 中的枚举也被称为枚举类型。它是一种用户自定义的数据类型,由整数值组成,并为这些值提供有意义的名称。在 C 中使用枚举使程序易于理解和维护。使用 enum 关键字来定义枚举。

以下是在 C 中定义枚举的方式:

enum flag { integer_const1, integer_const2, ..., integer_constN };

在上面的声明中,我们定义了名为 flag 的枚举,其中包含 N 个整数常量。integer_const1 的默认值为 0,integer_const2 为 1,依此类推。我们还可以在声明时更改整数常量的默认值。

例如:

enum fruits { mango, apple, strawberry, papaya };

其中,mango 的默认值为 0,apple 的默认值为 1,strawberry 的默认值为 2,papaya 的默认值为 3。如果我们想要更改这些默认值,可以这样做:

enum fruits {
    mango = 2,
    apple = 1,
    strawberry = 5,
    papaya = 7,
};

枚举类型声明

我们知道,在 C 语言中,我们需要声明预定义类型的变量,例如 intfloatchar 等。同样,我们可以声明用户自定义数据类型的变量,例如枚举。让我们看看如何声明枚举类型的变量。

假设我们创建了一个名为 status 的枚举类型,如下所示:

enum status { false, true };

现在,我们创建了 status 类型的变量:

enum status s; // 创建 status 类型的变量

在上面的语句中,我们声明了 s 变量的类型为 status

创建变量的两个语句可以写成:

enum status { false, true } s;

在这种情况下,false 的默认值为 0,true 的值为 1。

让我们创建一个简单的枚举示例。

#include <stdio.h>
enum weekdays { Sunday = 1, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday };

int main() {
    enum weekdays w; // 创建 weekdays 类型的变量
    w = Monday; // 将 Monday 的值赋给 w
    printf("The value of w is %d", w);
    return 0;
}

在上面的代码中,我们创建了一个名为 weekdays 的枚举类型,它包含了所有七个星期的名称。我们给 Sunday 赋值 1,所有其他名称的值将是前一个值加一。

输出:

1.png

让我们再演示一个例子,更加清楚地理解枚举。

#include <stdio.h>
enum months { jan = 1, feb, march, april, may, june, july, august, september, october, november, december };

int main() {
    // 打印 months 的值
    for (int i = jan; i <= december; i++) {
        printf("%d, ", i);
    }
    return 0;
}

在上面的代码中,我们创建了一个名为 months 的枚举类型,其中包含所有月份的名称。我们给 jan 赋值 1,所有其他月份的值将是前一个值加一。在 main() 方法中,我们定义了一个 for 循环,从 jan 开始初始化变量 i,这个循环将在 december 结束。

输出:

2.png

为什么要使用枚举?

当我们希望变量仅具有一组值时,可以使用枚举。例如,我们创建一个方向变量。由于我们知道存在四个方向(North、South、East、West),所以这个方向变量将有四个可能的值。但是该变量一次只能保存一个值。如果我们试图为此变量提供不同的值,编译器将会报错。

枚举还可以在 switch 语句中使用,我们将枚举变量传递给 switch 括号中。这样可以确保 case 块的值应在枚举中定义。

让我们看看如何在 switch 语句中使用枚举。

#include <stdio.h>
enum days { Sunday = 1, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday };

int main() {
    enum days d;
    d = Monday;
    switch (d) {
        case Sunday:
            printf("Today is Sunday");
            break;
        case Monday:
            printf("Today is Monday");
            break;
        case Tuesday:
            printf("Today is Tuesday");
            break;
        case Wednesday:
            printf("Today is Wednesday");
            break;
        case Thursday:
            printf("Today is Thursday");
            break;
        case Friday:
            printf("Today is Friday");
            break;
        case Saturday:
            printf("Today is Saturday");
            break;
    }
    return 0;
}

输出:

3.png

一些与枚举相关的重要事项

  • 枚举中可用的名称常量可以具有相同的值。让我们看个例子。

    #include <stdio.h>
    int main(void) {
        enum fruits { mango = 1, strawberry = 0, apple = 1 };
        printf("The value of mango is %d", mango);
        printf("\nThe value of apple is %d", apple);
        return 0;
    }

输出:

4.png

  • 如果我们没有为枚举名称分配值,则编译器将自动为枚举名称分配默认值,从 0 开始递增。
  • 我们还可以以任意顺序为枚举名称分配值,未分配值的名称将获得默认值,即前一个值加一。
  • 分配给枚举名称的值必须是整数常量,不能是其他类型,例如字符串、浮点数等。
  • 所有枚举名称在其范围内必须是唯一的,即如果我们定义了两个范围相同的枚举,则这两个枚举应具有不同的名称,否则编译器会报错。

让我们通过一个例子来理解这种情况。

#include <stdio.h>
enum status { success, fail };
enum boolean { fail, pass };

int main(void) {
    printf("The value of success is %d", success);
    return 0;
}

输出:

5.png

  • 在枚举中,我们还可以在不带名称的情况下定义枚举数据类型。
#include <stdio.h>
enum { success, fail } status;

int main(void) {
    status = success;
    printf("The value of status is %d", status);
    return 0;
}

输出:

6.png

枚举与宏在 C 中的区别

  • 宏也可以用于定义名称常量,但是在枚举中,所有名称常量可以在单个语句中组合在一起。

例如:

#define pass 0;
#define success 1;

上述两个语句可以使用枚举类型写成一个语句:

enum status { pass, success };
  • 枚举类型遵循作用域规则,而宏不遵循作用域规则。
  • 在枚举中,如果我们没有为名称分配值,则编译器会自动为名称分配默认值。但是在宏的情况下,需要显式地分配值。
  • 枚举的类型是整数,而宏的类型可以是任何类型。

标签: c语言, c语言教程, c语言技术, c语言学习, c语言学习教程, c语言下载, c语言开发, c语言入门教程, c语言进阶教程, c语言高级教程, c语言面试题, c语言笔试题, c语言编程思想