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