定义枚举
创建易读的命名值。
定义枚举 是 CoddyKit 上的免费 C Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 C Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 C Academy 课程共包含 4 节课。
什么是枚举
枚举是一种用户自定义类型,用于将一组命名的整型常量组合在一起。
您不必记住 0 表示星期一、1 表示星期二,而是可以为这些数字赋予易读的名称。这样代码更清晰,也更不容易出错。
基本语法
您可以使用 enum 关键字、标签名和花括号中的名称列表来声明枚举。
每个名称都会成为一个常量,可以在任何需要整数的地方使用。
enum Weekday { MON, TUE, WED, THU, FRI };默认值从 0 开始
默认情况下,第一个名称的值为 0,之后每个名称的值都比前一个大 1。
因此在 enum Weekday 中,MON 为 0,TUE 为 1,WED 为 2,依此类推。
#include <stdio.h>
enum Weekday { MON, TUE, WED, THU, FRI };
int main(void) {
printf("%d %d %d\n", MON, TUE, WED);
return 0;
}声明枚举变量
枚举类型存在后,您就可以创建该类型的变量。
变量会保存其中一个命名值。从底层看,它其实只是一个 int。
#include <stdio.h>
enum Weekday { MON, TUE, WED, THU, FRI };
int main(void) {
enum Weekday today = WED;
printf("today = %d\n", today);
return 0;
}枚举为何能提高可读性
请比较 if (state == 2) 和 if (state == PAUSED)。
后者本身就能说明含义。枚举让编译器跟踪值的含义,同时您阅读的是清晰的命名值,而不是令人困惑的数字。
enum Status { RUNNING, PAUSED, STOPPED };使用枚举进行分支选择
枚举与 switch 语句天然适配。每个命名值都会成为清晰的分支标签。
这是枚举在实际开发中最常见的用途之一。
#include <stdio.h>
enum Status { RUNNING, PAUSED, STOPPED };
int main(void) {
enum Status s = PAUSED;
switch (s) {
case RUNNING: printf("running\n"); break;
case PAUSED: printf("paused\n"); break;
case STOPPED: printf("stopped\n"); break;
}
return 0;
}枚举本质上只是整数
枚举常量可以与整数互换使用。您可以对它们进行算术运算和比较。
这种灵活性很方便,但也意味着 C 不会阻止您存储超出范围的数字。
#include <stdio.h>
enum Level { LOW, MID, HIGH };
int main(void) {
enum Level next = LOW + 1;
printf("%d\n", next);
return 0;
}匿名枚举
如果只需要这些常量而不需要命名类型,可以省略标签名。
这是定义一组相关整型常量的快捷方式。
#include <stdio.h>
enum { RED, GREEN, BLUE };
int main(void) {
printf("%d %d %d\n", RED, GREEN, BLUE);
return 0;
}命名约定
按照约定,枚举常量名会像宏一样使用 UPPER_CASE 书写。
这会向读者表明该值是固定常量。标签名通常使用 CamelCase 或 PascalCase。
enum TrafficLight { LIGHT_RED, LIGHT_YELLOW, LIGHT_GREEN };结合类型别名
到处书写 enum Weekday 会比较冗长。typedef 可以让您使用一个较短的名称。
完成类型别名声明后,您可以写成 Weekday today; 来声明变量,而不必使用 enum 关键字。
#include <stdio.h>
typedef enum { MON, TUE, WED } Weekday;
int main(void) {
Weekday d = TUE;
printf("%d\n", d);
return 0;
}枚举常量的作用域
枚举常量名与其作用域中的普通标识符共享同一个命名空间。
这意味着同一作用域中的两个枚举不能重复使用相同的常量名。请选择不同的名称以避免冲突。
enum A { OPEN, CLOSED };
enum B { LOCKED, UNLOCKED };快速检查
测试您对枚举默认值的理解。
回顾
枚举定义命名的整型常量。第一个值为 0,之后每个名称的值都比前一个大 1,除非您另行指定。
枚举可以提高代码可读性,与 switch 配合良好,也可以通过 typedef 缩短写法。接下来我们将探索自定义值和范围。
常见问题解答
「定义枚举」课时是免费的吗?
是的 — 「定义枚举」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 C Academy 课程的其余内容,请升级到 CoddyKit PRO。 C Academy 课程共包含 4 节课。
「定义枚举」这节课中我会学到什么?
创建易读的命名值。 你通过在浏览器中直接运行的动手代码来练习 C Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 C Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 C Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。
「定义枚举」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 C Academy 课中编写并运行代码吗?
能。每节 C Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。