在 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。
