1.枚举
之前我们我们学了关于结构体的知识,这里我们今天讲的枚举类型其实也是属于自定义类型的其中之一。既然都是属于同一种类型,避免不了枚举和结构体是由一些相似之处的,在这里我的建议是先了解结构体在来了解枚举会相对比较简单的学会枚举类型,在这里可以到我的知识库里面的结构体讲解里面去详细了解一下自定义类型。
1.1枚举类型的定义
所谓枚举就是一一列举的意思,像我们生活中的列举出星期,月份一样。它是由用户在程序中自行定义的。枚举是个类型,可以通过类型常见变量,而枚举创建这个变量的可能取值就在大括号里面,枚举的应用场景一般是把可以一一列举出来的定义成枚举类型,然后创建枚举类型的变量。
其定义的格式:
enum <枚举类型名>
{
枚举成员
};
注意:这里同样在最后不能丢掉了分号。
enum Ses
{
MALE,
FEMALE,
SECRET
};
在上面我们定义了一个枚举类型Ses,而打括号里面的就是枚举的可能取值。所以我们在给其赋值的时候只能赋值所给的可能取值。
就比如
enum Ses s=MALE;
这里要注意了,每个可能取值是用逗号隔开的。
这里的MALE就是枚举的可能取值之一。
而枚举的可能取值其实是常量,也叫枚举常量。
这里我们可以看一下他们的值分别是多少
这里我们看到了这里的第一个枚举常量默认是0,之后就一次往下递增。但是有时候你总会发现他可能不是我们想要的值,也就是说这里的默认值不合适,所以这里其实是可以更变得。
哪有的小伙伴就会问了,这里明明是枚举常量怎么可以改呢,在这里这里其实不是改,而是赋值上一个初始值,你可以类比一下const int a=10这里a被const修饰了,说明他是不可修改的,但是还是可以个a赋值上一个初始值的。
在上面的两个代码里面我们可以看到 MALE=2(第一个),FEMALE=2(第二个)所以我们我们可不可以直接enum Sex s=2这样写呢,可以看出我们编译出来了,那是不是就说明可以这样写呢?答案是否定的,这里的s他的类型是枚举类型的,而2的类型是int类型的,他们的类型不兼容会出现语法错误,那为什么这里可以编译过去呢?其实编译器对语法检查不是很严格。
1.2枚举的优点
既然枚举可以一一列举出想要的可能值,那其实也可以用另外一种写法——宏定义。
我们可以直接用宏定义来定义我们想要的可能取值:
#define MALE 0
#define FEMALE 1
#define SECRET 2
这样子不是也可以吗,如果从可执行代码这方面来讲的确是可以的,但是从优越性来讲的话enum枚举类型是更好的。
枚举类型有以下几个优点:
1:增加代码的可读性和可维护性。
2:和#define定义的标识符比较枚举由类型的检查,更加的严谨, #define定义的只是一个符号,但是用枚
举的时候是有类型的
3:防止匿名污染(匿名冲突)
4:便于调试。
5:使用方法,一次可以定义多个常量。
1.3枚举的使用
我们来简单的是使用一下枚举:
enum color
{
RED = 1,
GREEN=2,
BLUE=4
};
int main()
{
enum color clr = GREEN;//只拿到枚举常量给枚举变量赋值,才不会出现类型的差异
clr = 5;
printf("%d\n",clr);
return 0;
}
当然枚举的使用可不是像这样的,他的使用其实是很灵活的,这里就不多讲了。