在实际编程中,一些数据的取值往往有限,只能是非常少量的整数。 另外,为了便于在后续代码中使用,最好对各值进行命名,例如一周只有7天、一年只有12个月、一个班每周有6个课程等。
以每周7天为例,可以使用#define命令每天指定名称。
#包含
#define Mon 1
#define Tues 2
#定义wed 3
#define Thurs 4
#定义fri 5
#define Sat 6
#define Sun 7
int main () )。
int day;
扫描(“% d”,日期);
交换机(天) {
casemon:puts(Monday ); 布雷克;
casetues:puts(Tuesday ); 布雷克;
案例wed : puts (Wednesday ); 布雷克;
casethurs:puts(Thursday ); 布雷克;
casefri:puts(Friday ); 布雷克;
casesat:puts(Saturday ); 布雷克;
casesun:puts(Sunday ); 布雷克;
默认: puts (' error!' );
}
返回0;
}
执行结果:
5
弗雷迪
#define命令可以解决问题,但会带来不小的副作用,宏名称太多,代码松散,总觉得不舒服。 c语言提供枚举(Enum )类型,允许您列出和命名所有可能的值。
枚举类型的定义格式如下:
枚举类型名称{ value name 1,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开始递增,与上面的写法等价。
枚举是一种可以定义枚举变量的类型。
枚举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;
【例】判断用户输入了星期几。
#包含
int main () )。
enum week{ Mon=1,Tues,Wed,Thurs,Fri,Sat,Sun } day;
扫描(“% d”,日期);
交换机(天) {
casemon:puts(Monday ); 布雷克;
casetues:puts(Tuesday ); 布雷克;
案例wed : puts (Wednesday ); 布雷克;
casethurs:puts(Thursday ); 布雷克;
casefri:puts(Friday ); B
reak;case Sat: puts("Saturday"); break;
case Sun: puts("Sunday"); break;
default: puts("Error!");
}
return 0;
}
运行结果:
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, %dn", sizeof(enum week), sizeof(day), sizeof(Mon), sizeof(Wed), sizeof(int) );
return 0;
}
运行结果:
4, 4, 4, 4, 4
以上就是对 C语言枚举类型的资料整理,后续继续补充相关资料,谢谢大家对本站的支持!
本文标题: C语言 枚举类型(Enum)详解及示例代码
本文地址: http://www.cppcns.com/ruanjian/c/161383.html