在实际编程中,有些数据的取值往往是有限的,只能是非常少量的整数,并且最好为每个值都取一个名字,以方便在后续代码中使用,比如一个星期只有七天,一年只有十二个月,一个班每周有六门课程等。 以每周七天为例,我们可以使用 #define 命令来给每天指定一个名字:
- #include < stdio.h > #define Mon 1#define Tues 2#define Wed 3#define Thurs 4#define Fri 5#define Sat 6#define Sun 7 int main() {
- int day;
- scanf("%d", &day);
- switch (day) {
- case Mon:
- puts("Monday");
- break;
- case Tues:
- puts("Tuesday");
- break;
- case Wed:
- puts("Wednesday");
- break;
- case Thurs:
- puts("Thursday");
- break;
- case Fri:
- puts("Friday");
- break;
- case Sat:
- puts("Saturday");
- break;
- case Sun:
- puts("Sunday");
- break;
- default:
- puts("Error!");
- }
- return 0;
- }
运行结果: 5↙ Friday
命令虽然能解决问题,但也带来了不小的副作用,导致宏名过多,代码松散,看起来总有点不舒服。C 语言提供了一种枚举
- #define
类型,能够列出所有可能的取值,并给它们取一个名字。
- Enum
枚举类型的定义形式为:
- enum typeName{ valueName1, valueName2, valueName3, ...... };
- enum week{ Mon, Tues, Wed, Thurs, Fri, Sat, Sun };
也可以给每个名字都指定一个值:
- enum week{ Mon = 1, Tues = 2, Wed = 3, Thurs = 4, Fri = 5, Sat = 6, Sun = 7 };
更为简单的方法是只给第一个名字指定值:
- enum week{ Mon = 1, Tues, Wed, Thurs, Fri, Sat, Sun };
这样枚举值就从 1 开始递增,跟上面的写法是等效的。
枚举是一种类型,通过它可以定义枚举变量:
- enum week a, b, c;
也可以在定义枚举类型的同时定义变量:
- enum week{ Mon = 1, Tues, Wed, Thurs, Fri, Sat, Sun } a, b, c;
有了枚举变量,就可以把列表中的值赋给它:
- enum week {
- Mon = 1,
- Tues,
- Wed,
- Thurs,
- Fri,
- Sat,
- Sun
- };
- enum week a = Mon,
- b = Wed,
- c = Sat;
或者:
- enum week {
- Mon = 1,
- Tues,
- Wed,
- Thurs,
- Fri,
- Sat,
- Sun
- }
- a = Mon,
- b = Wed,
- c = Sat;
判断用户输入的是星期几。
- #include < stdio.h > int main() {
- enum week {
- Mon = 1,
- Tues,
- Wed,
- Thurs,
- Fri,
- Sat,
- Sun
- }
- day;
- scanf("%d", &day);
- switch (day) {
- case Mon:
- puts("Monday");
- break;
- case Tues:
- puts("Tuesday");
- break;
- case Wed:
- puts("Wednesday");
- break;
- case Thurs:
- puts("Thursday");
- break;
- case Fri:
- puts("Friday");
- break;
- case Sat:
- puts("Saturday");
- break;
- case Sun:
- puts("Sunday");
- break;
- default:
- puts("Error!");
- }
- return 0;
- }
运行结果: 4↙ Thursday
需要注意的两点是:
枚举和宏其实非常类似:宏在预处理阶段将名字替换成对应的值,枚举在编译阶段将名字替换成对应的值。我们可以将枚举理解为编译阶段的宏。
对于上面的代码,在编译的某个时刻会变成类似下面的样子:
- #include < stdio.h > int main() {
- enum week {
- Mon = 1,
- Tues,
- Wed,
- Thurs,
- Fri,
- Sat,
- Sun
- }
- day;
- scanf("%d", &day);
- switch (day) {
- case 1:
- puts("Monday");
- break;
- case 2:
- puts("Tuesday");
- break;
- case 3:
- puts("Wednesday");
- break;
- case 4:
- puts("Thursday");
- break;
- case 5:
- puts("Friday");
- break;
- case 6:
- puts("Saturday");
- break;
- case 7:
- puts("Sunday");
- break;
- default:
- puts("Error!");
- }
- return 0;
- }
- #include < stdio.h > int main() {
- enum week {
- Mon = 1,
- Tues,
- Wed,
- Thurs,
- Fri,
- Sat,
- Sun
- }
- day = Mon;
- printf("%d, %d, %d, %d, %d\n", sizeof(enum week), sizeof(day), sizeof(Mon), sizeof(Wed), sizeof(int));
- return 0;
- }
运行结果: 4, 4, 4, 4, 4
来源: http://www.cnblogs.com/zhjj/p/6683432.html