概念
枚举是一个自定义数据类型,用于为一组整数常量赋予有意义的名字,使代码更易读、更易维护。可以将它理解为“给数字起别名”
枚举成员的本质就是一系列整数常量。它们通过赋予有意义的名称,将数字“符号化”,使得代码更易读、更符合人类逻辑
语法结构
enum 枚举类型名 {
成员1, // 默认从0开始
成员2, // 前一个值+1
成员3 = 值, // 显式赋值
...
成员N
//
定义成员时也可以一行一行定义,使用习惯上是使用前一种方式
成员1,成员2,成员3,
}; // 注意结尾的分号!
enum Weekday {
Mon, // 0
Tue, // 1
Wed, // 2
Thu=7, // 7
Fri, // 8
Sat, // 9
Sun // 10
};
枚举成员的本质上是数值,第一成员默认是0,后续依次加1
如果中途进行赋值,后续的值会在赋值的基础上加1
为什么要使用枚举
在代码中直接出现的、未经解释的数值常量
这些数字没有明确的含义或上下文说明,导致代码难以理解和维护
不使用枚举
#include <stdio.h>
int main() {
int status = 1; // 1代表"失败"
if (status == 0) {
printf("程序成功!\n");
} else if (status == 1) {
printf("程序失败!\n"); // 这里会输出
} else if (status == 2) {
printf("程序等待中...\n");
}
// 问题1:数字0/1/2的意义不直观,需要查文档
// 问题2:可能误赋值非法值(如status = 100)
return 0;
}
使用枚举
#include <stdio.h>
// 定义枚举类型,明确状态含义
typedef enum {
SUCCESS, // 0
FAILURE, // 1
PENDING // 2
} ProgramStatus;
int main() {
ProgramStatus status = FAILURE; // 直接使用符号名
if (status == SUCCESS) {
printf("程序成功!\n");
} else if (status == FAILURE) {
printf("程序失败!\n"); // 这里会输出
} else if (status == PENDING) {
printf("程序等待中...\n");
}
// 优势1:代码自解释,无需注释
// 优势2:若修改状态值,只需调整枚举定义
// 优势3:编译器可部分检查非法赋值(如赋值字符串会报错)
return 0;
}