啊我摔倒了..有没有人扶我起来学习....
@TOC
前言
结构体、枚举、联合体都是自定义类型,结构体主要知识点结构体内存对齐可参考《C | 结构体内存对齐》
枚举
1. 枚举的定义
- 大括号内叫做枚举的可能取值,而每一个可能的取值都是常量
enum Color
{
RED,
GREEN,
BLUE
};
- 如果把可能取值都打印出来呢?
int main()
{
printf("%d\n", RED);
printf("%d\n", GREEN);
printf("%d\n", BLUE);
return 0;
}
打印结果: 可以看到,如果直接打印,默认是从0开始依次增加
- 既然枚举的可能取值都是常量,说明不能对它进行赋值,但若是创建枚举的时候初始化呢?
enum Color
{
RED ,
GREEN = 10,
BLUE
};
打印结果: 发现确实可以,并且会影响后面没初始化的值
2. 枚举的内存大小
- 既然枚举的可能取值类似于整型常量,那三个变量的话就是
12
字节?
int main()
{
printf("%d\n", sizeof(enum Color));
return 0;
}
打印结果:
可以看到,既然是可能取值,每次只可能取一个值,所以是
4
个字节。==但是!这个跟具体编译器有关,望铁汁们稍加注意==
3. 枚举的优势
- 看完以上内容,铁汁们可能会觉得枚举根本没鸟用嘛!别急,咱们细细研究一下~
- 我们可以使用
#define
定义常量,为什么非要使用枚举?~来对比一下
enum Color
{
RED = 5,
GREEN = 7,
BLUE = 10
};
#define RED 5
#define GREEN 7
#define BLUE 10
- 看起来是这么回事没错,但是,我们要知道,
#define
是预处理指令,也就是说,#define
定义的常量在预处理阶段就已经进行了替换,所有的RED
就已经替换成了5
,那么等我们调试的时候要是出现了问题,就不好发现了
枚举的优点总结:
- 增加代码的可读性和可维护性
- 与
#define
定义的标识符比较,枚举拥有类型,更加严谨 - 防止了命名污染(封装)
- 便于调试
- 使用方便,一次可以定义多个常量
4. 枚举需要注意的地方
- 虽然枚举的可能取值是常量,类似于整形常量,并且某些编译器下还可以混合起来计算,但是要注意避免这种情况
- 只能拿枚举常量给枚举变量赋值,这样才不会出现类型的差异
enum Color clr = GREEN;//可以
enum Color clr = 5;//有些编译器可以通过,但最好不要