枚举把一组相关的整数常量组织成具有名字的类型。名字比散落的数字更容易阅读,也能让函数参数和变量表达有限状态的含义。
#include <stdio.h>
enum TrafficLight {
LIGHT_RED,
LIGHT_YELLOW,
LIGHT_GREEN
};
const char *light_message(enum TrafficLight light) {
switch (light) {
case LIGHT_RED:
return "stop";
case LIGHT_YELLOW:
return "prepare";
case LIGHT_GREEN:
return "go";
default:
return "unknown";
}
}
int main(void) {
enum TrafficLight current = LIGHT_GREEN;
printf("%s\n", light_message(current));
return 0;
}未显式赋值时,第一个枚举常量通常从 0 开始,后续常量依次加一。也可以指定整数值;下一个未指定的常量从前一个值继续加一。枚举常量本质上是整数常量,但变量仍应使用枚举类型表达意图。
#include <stdio.h>
enum LogLevel {
LOG_DEBUG = 10,
LOG_INFO = 20,
LOG_WARNING = 30,
LOG_ERROR = 40
};
int main(void) {
enum LogLevel level = LOG_WARNING;
if (level >= LOG_WARNING) {
puts("show an alert");
}
printf("numeric value: %d\n", level);
return 0;
}C 的 enum 不会自动把值转换成名称。若要显示 LIGHT_GREEN 这样的文本,应编写 switch 函数或名称表。
知识测验
题目
若没有显式赋值,LIGHT_YELLOW 的整数值是多少?
知识测验
题目
为什么使用 enum TrafficLight 而不是裸整数?