enum c++C语⾔枚举类型(C语⾔enum⽤法)详解
本⽂转载⾃:
在实际编程中,有些数据的取值往往是有限的,只能是⾮常少量的整数,并且最好为每个值都取⼀个名字,以⽅便在后续代码中使⽤,⽐如⼀个星期只有七天,⼀年只有⼗⼆个⽉,⼀个班每周有六门课程等。
以每周七天为例,我们可以使⽤#define命令来给每天指定⼀个名字:
1 #include <stdio.h>
2
3#define Mon 1
4#define Tues 2
5#define Wed 3
6#define Thurs 4
7#define Fri 5
8#define Sat 6
9#define Sun 7
10
11int main(){
12int day;
13    scanf("%d", &day);
14switch(day){
15case Mon: puts("Monday"); break;
16case Tues: puts("Tuesday"); break;
17case Wed: puts("Wednesday"); break;
18case Thurs: puts("Thursday"); break;
19case Fri: puts("Friday"); break;
20case Sat: puts("Saturday"); break;
21case Sun: puts("Sunday"); break;
22default: puts("Error!");
23    }
24return0;
25 }
运⾏结果:
5↙
Friday
#define命令虽然能解决问题,但也带来了不⼩的副作⽤,导致宏名过多,代码松散,看起来总有点不舒服。C语⾔提供了⼀种枚举(Enum)类型,能够列出所有可能的取值,并给它们取⼀个名字。
枚举类型的定义形式为:
enum typeName{ valueName1, valueName2, valueName3, ...... };
enum是⼀个新的关键字,专门⽤来定义枚举类型,这也是它在C语⾔中的唯⼀⽤途;typeName是枚举类型的名字;valueName1, valueName2, valueName3, ......是每个值对应的名字的列表。
注意最后的;不能少。
例如,列出⼀个星期有⼏天:
enum week{ Mon, Tues, Wed, Thurs, Fri, Sat, Sun };
可以看到,我们仅仅给出了名字,却没有给出名字对应的值,这是因为枚举值默认从 0 开始,往后逐个加 1(递增);也就是说,week 中的 Mon、Tues ...... Sun 对应的值分别为 0、1 ...... 6。
更为简单的⽅法是只给第⼀个名字指定值:
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!");
}
return0;
}
运⾏结果:
4↙
Thursday
需要注意的两点是:
1) 枚举列表中的 Mon、Tues、Wed 这些标识符的作⽤范围是全局的(严格来说是 main() 函数内部),不能再定义与它们名字相同的变量。
2) Mon、Tues、Wed 等都是常量,不能对它们赋值,只能将它们的值赋给其他的变量。
枚举和宏其实⾮常类似:宏在预处理阶段将名字替换成对应的值,枚举在编译阶段将名字替换成对应的值。我们可以将枚举理解为编译阶段的宏。
对于上⾯的代码,在编译的某个时刻会变成类似下⾯的样⼦:
#include <stdio.h>
int main(){
enum week{ Mon = 1, Tues, Wed, Thurs, Fri, Sat, Sun } day;
scanf("%d", &day);
switch(day){
case1: puts("Monday"); break;
case2: puts("Tuesday"); break;
case3: puts("Wednesday"); break;
case4: puts("Thursday"); break;
case5: puts("Friday"); break;
case6: puts("Saturday"); break;
case7: puts("Sunday"); break;
default: puts("Error!");
}
return0;
}
Mon、Tues、Wed 这些名字都被替换成了对应的数字。这意味着,Mon、Tues、Wed 等都不是变量,它们不占⽤数据区(常量区、全局数据区、栈区和堆区)的内存,⽽是直接被编译到命令⾥⾯,放到代码区,所以不能⽤&取得它们的地址。这就是枚举的本质。
枚举类型变量需要存放的是⼀个整数,我猜测它的长度和 int 应该相同,下⾯来验证⼀下:
1. #include <stdio.h>
2.
3. int main(){
4. enum week{ Mon = 1, Tues, Wed, Thurs, Fri, Sat, Sun } day = Mon;
5. printf("%d, %d, %d, %d, %d\n", sizeof(enum week), sizeof(day), sizeof(Mon), sizeof(Wed), sizeof(int) );
6. return 0;
7. }
运⾏结果:
4, 4, 4, 4, 4

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。