枚举类型(Enumeration Type)是C语言中的一种用户自定义数据类型,它允许我们定义一组具有离散值的常量,每个常量都有一个名称和一个关联的整数值。
定义
enum 枚举类型名 {
枚举常量1,
枚举常量2,
枚举常量3,
// ...更多枚举常量
};
声明
cpp
enum Weekday today; // 声明一个Weekday类型的变量today
enum Weekday {
MONDAY,
TUESDAY,
WEDNESDAY,
THURSDAY,
FRIDAY,
SATURDAY,
SUNDAY
} today, tomorrow;
默认,枚举常量的值从0开始,依次递增。在上面的例子中:
-
MONDAY 的值为 0
-
TUESDAY 的值为 1
-
WEDNESDAY 的值为 2
也可以自己写:
cpp
enum Weekday {
MONDAY = 1, // 从1开始
TUESDAY, // 自动为2
WEDNESDAY, // 自动为3
THURSDAY, // 自动为4
FRIDAY, // 自动为5
SATURDAY, // 自动为6
SUNDAY // 自动为7
};
enum Status {
START = 0,
RUNNING = 5,
PAUSED = 10,
STOPPED = 15
};
基本使用
cpp
#include <stdio.h>
enum Weekday {
MONDAY,
TUESDAY,
WEDNESDAY,
THURSDAY,
FRIDAY,
SATURDAY,
SUNDAY
};
int main() {
enum Weekday today = WEDNESDAY;
printf("今天是星期%d\n", today + 1); // 输出:今天是星期3
// 使用枚举常量进行比较
if (today == WEDNESDAY) {
printf("今天是星期三\n");
}
// 枚举变量可以赋值为整数
today = 6; // 相当于 today = SUNDAY
// 枚举变量可以参与算术运算
enum Weekday tomorrow = (today + 1) % 7;
return 0;
}
枚举类型特别适合与switch语句一起使用:
cpp
#include <stdio.h>
enum Weekday {
MONDAY,
TUESDAY,
WEDNESDAY,
THURSDAY,
FRIDAY,
SATURDAY,
SUNDAY
};
int main() {
enum Weekday today = WEDNESDAY;
switch (today) {
case MONDAY:
printf("今天是星期一\n");
break;
case TUESDAY:
printf("今天是星期二\n");
break;
case WEDNESDAY:
printf("今天是星期三\n");
break;
case THURSDAY:
printf("今天是星期四\n");
break;
case FRIDAY:
printf("今天是星期五\n");
break;
case SATURDAY:
case SUNDAY:
printf("今天是周末\n");
break;
default:
printf("无效的星期\n");
}
return 0;
}
枚举类型的大小
cpp
int main() {
printf("枚举类型的大小: %zu字节\n", sizeof(enum Weekday)); // 通常输出4(在大多数系统上)
return 0;
}
匿名枚举
cpp
只枚举常量
#include <stdio.h>
int main() {
// 匿名枚举
enum {
RED,
GREEN,
BLUE
};
int color = GREEN;
printf("选择的颜色代码: %d\n", color); // 输出:选择的颜色代码: 1
return 0;
}
枚举常量经常用于表示位标志(bit flags),这在需要表示多个选项的组合时非常有用:
cpp
#include <stdio.h>
// 文件权限标志
enum FilePermission {
READ = 1, // 二进制: 001
WRITE = 2, // 二进制: 010
EXECUTE = 4 // 二进制: 100
};
int main() {
// 组合权限
int permissions = READ | WRITE; // 二进制: 011 (值为3)
// 检查是否有读权限
if (permissions & READ) {
printf("有读权限\n");
}
// 检查是否有写权限
if (permissions & WRITE) {
printf("有写权限\n");
}
// 检查是否有执行权限
if (permissions & EXECUTE) {
printf("有执行权限\n");
} else {
printf("没有执行权限\n");
}
// 添加执行权限
permissions |= EXECUTE; // 现在permissions的值为7 (二进制: 111)
// 移除写权限
permissions &= ~WRITE; // 现在permissions的值为5 (二进制: 101)
return 0;
}
枚举常量的作用域与变量的作用域规则相同。在全局定义的枚举常量具有全局作用域,在函数内定义的枚举常量具有局部作用域。
枚举常量的唯一性
cpp
enum Color { RED, GREEN, BLUE };
enum Traffic { RED, YELLOW, GREEN }; // 错误:RED和GREEN已经在前面定义过
类型安全
cpp
enum Weekday day = 42; // 合法,但42不是有效的Weekday值