文章目录
- [1. 基本定义](#1. 基本定义)
- [2. 声明枚举变量](#2. 声明枚举变量)
- [3. 自定义枚举值](#3. 自定义枚举值)
- [4. 使用 typedef 简化](#4. 使用 typedef 简化)
- [5. 枚举的特点与优势](#5. 枚举的特点与优势)
- [6. 实际应用示例:Switch 语句](#6. 实际应用示例:Switch 语句)
- 7. 枚举 vs #define
- 注意事项
在C语言中,枚举(Enumeration,简称 enum)是一种基本的数据类型,也是用户自定义的数据类型,用于定义一组具有离散值的常量,它允许你为一组整数值分配有意义的名字。使用枚举可以显著提高代码的可读性和可维护性。
1. 基本定义
枚举通过关键字 enum 定义,其成员默认从 0 开始递增。
bash
enum Weekday {
MON, // 0
TUE, // 1
WED, // 2
THU, // 3
FRI, // 4
SAT, // 5
SUN // 6
};
1.1、枚举变量定义八股文
先定义枚举类型,再定义枚举变量
bash
enum DAY
{
MON=1, TUE, WED, THU, FRI, SAT, SUN
};
enum DAY day;
定义枚举类型的同时定义枚举变量
bash
enum DAY
{
MON=1, TUE, WED, THU, FRI, SAT, SUN
} day;
省略枚举名称,直接定义枚举变量
bash
enum
{
MON=1, TUE, WED, THU, FRI, SAT, SUN
} day;
2. 声明枚举变量
定义好枚举类型后,可以创建该类型的变量:
bash
enum Weekday today;
today = WED;
if (today == WED) {
printf("今天是周三\n");
}
3. 自定义枚举值
你可以手动指定枚举成员的值。如果某个成员未指定,它将比前一个成员大 1。
bash
enum State {
SLEEP = 1,
RUNNING = 5,
STOP, // 自动变为 6
ERROR = -1
};
4. 使用 typedef 简化
在C语言中,每次声明变量都要写 enum 比较繁琐,通常配合 typedef 使用:
bash
typedef enum {
RED,
GREEN,
BLUE
} Color;
Color myColor = RED; // 不再需要写 enum 关键字
5. 枚举的特点与优势
1、本质是整数:在编译器内部,枚举成员被当作 int 处理。这意味着你可以直接在 printf 中打印它们,或者在 switch 语句中使用。
2、提高可读性:用 COLOR_RED 代替数字 0,使代码意图更明显。
3、类型安全(弱):虽然枚举本质是整数,但它在逻辑上将一组相关的常量归类。
4、调试友好:在调试器中,通常可以看到枚举的名字而不是冷冰冰的数字。
6. 实际应用示例:Switch 语句
枚举与 switch 是绝配,常用于处理状态机或选项。
bash
#include <stdio.h>
typedef enum {
CMD_START,
CMD_STOP,
CMD_PAUSE
} Command;
void handleCommand(Command cmd) {
switch (cmd) {
case CMD_START: printf("启动中...\n"); break;
case CMD_STOP: printf("停止中...\n"); break;
case CMD_PAUSE: printf("暂停中...\n"); break;
}
}
int main() {
handleCommand(CMD_START);
return 0;
}
7. 枚举 vs #define
虽然 #define 也可以定义常量,但枚举有以下优点:
自动赋值:不需要手动为每个常量写数字。
作用域限制:枚举遵循变量的作用域规则,而宏是全局替换。
分组:枚举将相关的常量组织在一起,形成一个独立的类型。
类型检查:枚举变量赋值或判断会进行类型检查,不会报错但是会在Waring或者代码品质对应时体现。
注意事项
1、枚举成员的名字在同一作用域内必须是唯一的(不能有两个不同的枚举类型包含同名的成员)。可以认为枚举变量类似于宏定义,所以和宏定义一样不能重复。
2、枚举变量的大小通常等同于 int 的大小(取决于编译器实现)。