C语言教程-C 中的枚举
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 语言中,我们需要声明预定义类型的变量,例如 int、float、char 等。同样,我们可以声明用户自定义数据类型的变量,例如枚举。让我们看看如何声明枚举类型的变量。
假设我们创建了一个名为 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,所有其他名称的值将是前一个值加一。
输出:

让我们再演示一个例子,更加清楚地理解枚举。
#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 结束。
输出:

为什么要使用枚举?
当我们希望变量仅具有一组值时,可以使用枚举。例如,我们创建一个方向变量。由于我们知道存在四个方向(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;
}输出:

一些与枚举相关的重要事项
枚举中可用的名称常量可以具有相同的值。让我们看个例子。
#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; }
输出:

- 如果我们没有为枚举名称分配值,则编译器将自动为枚举名称分配默认值,从 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;
}输出:

- 在枚举中,我们还可以在不带名称的情况下定义枚举数据类型。
#include <stdio.h>
enum { success, fail } status;
int main(void) {
status = success;
printf("The value of status is %d", status);
return 0;
}输出:

枚举与宏在 C 中的区别
- 宏也可以用于定义名称常量,但是在枚举中,所有名称常量可以在单个语句中组合在一起。
例如:
#define pass 0;
#define success 1;上述两个语句可以使用枚举类型写成一个语句:
enum status { pass, success };- 枚举类型遵循作用域规则,而宏不遵循作用域规则。
- 在枚举中,如果我们没有为名称分配值,则编译器会自动为名称分配默认值。但是在宏的情况下,需要显式地分配值。
- 枚举的类型是整数,而宏的类型可以是任何类型。