三. 枚举
枚举:就是一一列举,把可能的取值一一列举。
比如生活中:
1.一周的星期一到星期日是有限的7天,可以一一列举。
2.性别有:男、女、保密,也可以一一列举。
2.月份有12个月,也可以一一列举
这就可以使用枚举了。
————1.枚举类型的定义
//enum Day//星期
//{
//?? ?Mon,
//?? ?Tues,
//?? ?Wed,
//?? ?Thur,
//?? ?Fri,
//?? ?Sat,
//?? ?Sun
//};
//enum Sex//性别
//{
//?? ?MALE,
//?? ?FEMALE,
//?? ?SECRET
//};
//enum Color//颜色
//{
//?? ?RED,
//?? ?GREEN,
//?? ?BLUE,
//};
以上定义的 enum Day , enum Sex , enum Color 都是枚举类型。
{}中的内容是枚举类型的可能取值,也叫 枚举常量 。
————2.枚举变量赋值只可以用枚举常量
//enum Day
//{
//?? ?Mon,
//?? ?Tues,
//?? ?Wed,
//?? ?Thur,
//?? ?Fri,
//?? ?Sat,
//?? ?Sun
//};
//int main()
//{
//?? ?enum Day d = Fri;
//?? ?return 0;
//}
这些可能取值都是有值的,默认从0开始,一次递增1,在定义 枚举常量的时候
也可以赋初值,比如下面的枚举类型,red被赋值1,后面的就会依次递增1。
例如:
//enum Color//颜色
//{
//?? ?red= 1,
//?? ?green,
//?? ?blue,
//};
//int main()
//{
//?? ?printf("%d\n",red);
//?? ?printf("%d\n", green);
//?? ?printf("%d\n", blue);
//?? ?return 0;
//}//打印结果为1 2 3
————————3.枚举的优点
为什么使用枚举?
我们可以使用 #define 定义常量,为什么非要使用枚举?
答:#define 定义常量时,每定义一个常量就要写一次#define,可读性不高,维护性太低
枚举的优点:
1. 增加代码的可读性(能让人快速理解、轻松维护、容易扩展)和可维护性(解决问题效率的快慢)
2. 和#define定义的标识符比较枚举有类型检查(比如; enum Color clr = green,green有对应的值,假设为1,但是 ),更加严谨。
3. 防止了命名污染(封装)
4. 便于调试
5. 使用方便,一次可以定义多个常量
//test.c文件————(预处理)———》编译————》链接————》生成.exe的文件
在预处理阶段,代码会发生如下变化:
//#define M 100;
//void main()
//{
//?? ?int n = M;
//}
就会变成
//void main()
//{
//?? ?int n = 100;//M被100替换,#define代码显示
//}
然后对代码进行调试,对可执行程(.exe)序进行调试,调试在预处理之后。
调试的代码其实是
//void main()
//{
//?? ?int n = 100;
//}
这样的代码翻译成二进制指令的时候调试,即不能很好的观测到与M相关的值的。
而枚举类型并不是替换值,如果在代码中我们用到了枚举类型,在调试的时候依然可以观察到这些相关的值的,所以枚举相对于#define更便于调试
而对于宏(#define)来说其在预处理阶段就替换了。代码就消失了,只是把值赋了过来。导致调试时的代码与所见代码并不相同。
#define的变量没有类型,而枚举类型有类型
//4.————枚举的使用
//enum Color//颜色
//{
//?? ?RED = 1,
//?? ?GREEN = 2,
//?? ?BLUE = 4
//};
//enum Color clr = GREEN;//只能拿枚举常量给枚举变量赋值,才不会出现类型的差异。
//clr = 5;