c枚举类型enum例题_C语⾔枚举类型(Enum)详解及⽰例代
在实际编程中,有些数据的取值往往是有限的,只能是⾮常少量的整数,并且最好为每个值都取⼀个名字,以⽅便在后续代码中使⽤,⽐如⼀个星期只有七天,⼀年只有⼗⼆个⽉,⼀个班每周有六门课程等。
以每周七天为例,我们可以使⽤#define命令来给每天指定⼀个名字:
#include
#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
#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 = 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
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;enum c++
}
运⾏结果:
4↙
Thursday
需要注意的两点是:
1) 枚举列表中的 Mon、Tues、Wed 这些标识符的作⽤范围是全局的,不能再定义与它们名字相同的变量。
2) Mon、Tues、Wed 等都是常量,不能对它们赋值,只能将它们的值赋给其他的变量。
枚举和宏其实⾮常类似:宏在预处理阶段将名字替换成对应的值,枚举在编译阶段将名字替换成对应的值。我们可以将枚举理解为编译阶段的宏。
对于上⾯的代码,在编译的某个时刻会变成类似下⾯的样⼦:
#include
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;
}
Mon、Tues、Wed 这些名字都被替换成了对应的数字。这意味着,Mon、Tues、Wed 等都不是变量,它们不占⽤数据区(常量区、全局数据区、栈区和堆区)的内存,⽽是直接被编译到命令⾥⾯,放到代码区,所以不能⽤&取得它们的地址。这就是枚举的本质。
关于程序在内存中的分区以及各个分区的作⽤,我们将在《C语⾔内存》专题中的《Linux下C语⾔程序的内存布局(内存模型)》⼀节中详细讲解。
我们在《C语⾔switch语句》⼀节中讲过,case 关键字后⾯必须是⼀个整数,或者是结果为整数的表达式,但不能包含任何变量,正是由于 Mon、Tues、Wed 这些名字最终会被替换成⼀个整数,所以它们才能放在 case 后⾯。
结构体变量需要存放的是⼀个整数,我猜测它的长度和 int 应该相同,下⾯来验证⼀下:
#include
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
以上就是对 C语⾔枚举类型的资料整理,后续继续补充相关资料,谢谢⼤家对本站的⽀持!
本⽂标题: C语⾔ 枚举类型(Enum)详解及⽰例代码

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