简单介绍
枚举顾名思义就是一一列举,把可能的值一一列举,比如我们现实生活中:
一周的星期日到星期六是有限的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的大小,使用枚举会更严谨一些。
学习自:比特鹏哥——C语言课程