0Pricing
C Academy · 课时

定义枚举

创建易读的命名值。

定义枚举 是 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 反馈 — 无需本地设置。

此课程中的所有课时

  1. 定义枚举
  2. 枚举值与范围
  3. const 变量
  4. #define 常量
← 返回 C Academy