一、枚举类型
枚举也是一种自定义类型,枚举类型的关键字是enum。枚举的意思就是:
🏀●枚举顾名思义就是一一列举,把可能的取值一一列举出来。
在现实生活中其实有很多有限的可以一一列举出来的值,比如人的性别只有男、女两种;一个周只有星期一到星期日这7天;还有光学三原色是指红、绿、蓝这3种颜色。这些都是可以一一列举出来的值:
enum Day //星期
{
Mon,
Tues,
Wed,
Thur,
Fri,
Sat,
Sun
};
enum Sex //性别
{
MALE,
fEMALE
};
enum Color //颜⾊
{
RED,
GREEN,
BLUE
};
以上定义的enum Day ,enum Sex ,enum Color都是枚举类型。{ }中的内容是枚举类型的可能取值,也叫枚举常量。这些可能取值都是有值的,🍕默认从0开始,依次递增1🍕,当然在声明枚举类型的时候也可以赋初值。
上面列举了一些枚举类型,可以看出枚举类型的定义与结构体很类似:
需要记住枚举类型{ }中的不是变量,而是常量。也就是不管你起了什么名字,他们都是常量,是有值的:
#include<stdio.h>
enum Color //颜⾊
{
RED,
GREEN,
BLUE
};
int main()
{
printf("%d\n", RED);
printf("%d\n", GREEN);
printf("%d\n", BLUE);
return 0;
}
程序运行结果:
这里在声明枚举类型时,没有赋初值,那枚举类型中的枚举常量顺序往下就默认是从0开始往下依次递增1。如果我们在声明枚举类型时,给其中的枚举常量赋初始值,那会出现什么呢?
#include<stdio.h>
enum Color //颜⾊
{
RED,
GREEN=5,
BLUE
};
int main()
{
printf("%d\n", RED);
printf("%d\n", GREEN);
printf("%d\n", BLUE);
return 0;
}
上面我们给第二个枚举常量赋值为5,再打印三个枚举常量的值发现,第三个枚举常量的值是6,第一个枚举常量的值依然是0。从这里我就可以知道,🥗枚举类型中的枚举常量成员如果哪个被赋了初始值,则这个枚举常量往后的枚举常量成员的值也紧跟着在这个初始值的基础上往下递增1🥗,而第一个枚举常量没有赋初值,默认他的值还是从0开始。再看下面的代码来充分理解枚举类型中枚举常量的值:
#include<stdio.h>
enum Test
{
A,
B = 7,
C,
D = 5,
E
};
int main()
{
printf("%d\n", A);
printf("%d\n", B);
printf("%d\n", C);
printf("%d\n", D);
printf("%d\n", E);
return 0;
}
程序运行结果:
枚举类型变量的创建
枚举类型的变量怎么创建呢?如下:
#include<stdio.h>
enum Sex
{
MALE,
FEMALE
};
int main()
{
enum Sex s1 = MALE;
enum Sex s2 = FEMALE;
return 0;
}
创建枚举类型的变量,赋给他的值只能从这个枚举类型的枚举常量成员中选。
二、枚举类型的优点
可能有同学会想,为什么使用枚举?我们可以使用#define定义常量,为什么非要使用枚举?
枚举的优点:
🏐1.增加代码的可读性和可维护性
🏐2.和#define定义的标识符相比枚举有类型检查,更加严谨。
🏐3.便于调试,预处理阶段会删除#define定义的符号
🏐4.使用方便,一次可以定义多个常量
🏐5.枚举常量是遵循作用域规则的,若枚举声明在函数内,那就只能在函数内使用
对于第一条枚举能增加代码的可读性,我们说过枚举中的枚举常量是有值的,有时我们写代码,用到的数字可能就表示一些特殊的含义,那这里用枚举常量就相当于给这些数字起了一个名字,代替了这些数字,我们就能见名知意。也就增加了代码的可读性。
第二条说的是枚举有类型检查,对于枚举类型中的枚举常量成员他们是有类型的,他们的类型就是枚举类型,虽然我们知道他们有值,但是他们依然属于枚举类型,所以在对枚举类型的变量赋值时,只能使用枚举类型中的枚举常量给他们赋值,而不能使用枚举常量所表示的值给枚举类型的变量赋值。只是在C语言中没有那么严格。但是如果在c++中,你把整数赋值给枚举类型的变量时,编译器会报错的,在c++中的类型检查比较严格。
而用#define定义的标识符是没有类型可言的。编译器在预处理阶段,会将#define定义的标识符全部替换为标识符所代表的值。而且相比较于#define,枚举使用方便,一次就定义多个枚举常量。如果使用#define的话,每定义一个标识符,都要写一个#define,费时费力。