简单介绍
枚举顾名思义就是一一列举,把可能的值一一列举,比如我们现实生活中:一周的星期日到星期六是有限的7天,可以一一列举;性别有:男、女、保密,也可以一一列举;月份有12个,也可以一一列举。
枚举类型的定义
#include <stdio.h> enum Day { Mon, //0 Tues, //1 Wed, //2 Thur, //3 Fri, //4 Sat, //5 Sun //6 }; enum Sex { MALE = 5, //5 FEMALE, //6 SECRET //7 }; int main() { enum Day d = Mon; printf("%d\n", d); enum Sex s = SECRET; printf("%d\n", s); return 0; }
以上定义的enum Day,enum Sex都是枚举类型。{}里的内容是枚举类型的可能取值,也叫枚举常量。
这些可能取值都是有值的,默认从0开始,依次递增1,在定义的时候也可以赋初值。enum Sex中就是赋了初始值的。上面的代码运行起来的结果为:
枚举和结构体的区别
我们可以从他们的大小来验证这一点,例如:
#include <stdio.h> enum Sex { MALE , FEMALE, SECRET }; struct S { char c1; char c2; int n; }; int main() { printf("int = %u\n", sizeof(int)); printf("enum Sex = %u\n", sizeof(enum Sex)); printf("struct S = %u\n", sizeof(struct S)); return 0; }
因为枚举类型中的枚举常量是整型,所以枚举类型的大小与int大小一致
代码运行结果为:
枚举的优点
我们可以使用#define定义常量,为什么非要用枚举?
因为枚举有许多优点:
1.增加代码的可读性和可维护性。 2.和#define定义的标识符比较,枚举有类型检查,更加严谨。3.防止了命名污染(封装)。
4.便于调试。
5.使用方便,一次可以定义多个常量。
着重解释一下第3、4点。
防止命名污染
在枚举类型中定义的枚举常量,它是属于枚举类型范围内的;而如果用#define定义的则是属于全局的。
命名污染:如果定义了一个变量,在哪里都能被使用(全局),那么在使用它的过程中容易与其他相同名字的变量产生冲突,这种情况就叫做命名污染。
便于调试
总结
在可以使用#define定义和枚举类型定义的时候,我们都建议优先使用枚举类型,而不是#define定义。枚举类型的大小等于int的大小,使用枚举会更严谨一些。