C 语言 Enum

17 Mar 2025 | 5 分钟阅读

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

以下是定义 C 中 enum 的方法

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

例如

mango 的默认值为 0,apple 为 1,strawberry 为 2,papaya 为 3。如果我们想更改这些默认值,可以按如下方式操作

枚举类型声明

正如我们所知,在 C 语言中,我们需要声明预定义类型(如 int、float、char 等)的变量。同样,我们可以声明用户定义数据类型(如 enum)的变量。让我们看看如何声明 enum 类型的变量。

假设我们创建了如下所示的 status 类型的 enum

现在,我们创建一个 status 类型的变量

在上面的语句中,我们已经声明了 status 类型的变量 's'。

要创建变量,上面的两个语句可以写成

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

让我们创建一个简单的 enum 程序。

在上面的代码中,我们创建了一个名为 weekdays 的 enum 类型,它包含所有七天的名称。我们将 Sunday 的值赋为 1,所有其他名称都将被赋予比前一个值加一的值。

输出

Enum in C

让我们通过另一个示例来更清楚地理解 enum。

在上面的代码中,我们创建了一个名为 months 的 enum 类型,它包含所有月份的名称。我们将值“1”赋给一月,其他月份的值都将是前一个值加一。在 main() 方法中,我们定义了一个 for 循环,其中我们初始化变量 'i' 为 jan,并且该循环将迭代直到 December。

输出

Enum in C

我们为什么要使用 enum?

当我们希望我们的变量只有一组值时,就会使用 enum。例如,我们创建一个 direction 变量。我们知道存在四个方向(北、南、东、西),所以这个 direction 变量将有四个可能的值。但变量一次只能容纳一个值。如果我们尝试为该变量提供一个不同的值,它将引发编译错误。

enum 也用于 switch case 语句,我们在其中将 enum 变量传递给 switch 语句。它确保 case 块的值必须在 enum 中定义。

让我们看看如何在 switch case 语句中使用 enum。

输出

Enum in C

与 enum 相关的一些要点

  • enum 类型中可用的 enum 名称可以具有相同的值。让我们看一个示例。

输出

Enum in C
  • 如果我们不为 enum 名称提供任何值,编译器将自动为 enum 名称分配从 0 开始的默认值。
  • 我们也可以按任何顺序为 enum 名称提供值,未分配的名称将获得前一个值加一的默认值。
  • 赋给 enum 名称的值必须是整数常量,即它不应该是字符串、float 等其他类型。
  • 所有 enum 名称在其作用域内都必须是唯一的,即如果我们定义了两个具有相同作用域的 enum,那么这两个 enum 必须有不同的 enum 名称,否则编译器将报错。

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

输出

Enum in C
  • 在枚举中,我们可以定义一个没有名称的枚举数据类型。

输出

Enum in C

C 中的 Enum vs. Macro

  • 宏也可以用来定义命名常量,但在 enum 的情况下,所有命名常量都可以分组在一个语句中。
    例如:
    #define pass 0;
    #define success 1;

    上面的两个语句可以通过使用 enum 类型写成一个语句。
    enum status{pass, success};
  • enum 类型遵循作用域规则,而宏不遵循作用域规则。
  • 在 Enum 中,如果我们不为 enum 名称赋值,编译器将自动为 enum 名称分配默认值。但是在宏的情况下,需要显式赋值。
  • C 中 enum 的类型是整数,但宏的类型可以是任何类型。

下一主题C 教程