枚举类型
文章编写遵循 " why - what - how - how to good "
Why - 😑😐😶
枚举可以让数据更易读、更简洁。
-
有含义的数字和直接描述的文字,哪个更易读?当然是后者!
switch (color_number) { case 1: printf("red\n"); break; case 2: printf("blue\n"); break; case 3: printf("green\n"); break; } ----------------------------------------- enum color { red = 1, blue, green } color; switch (color_name) { case red: printf("red\n"); break; case blue: printf("blue\n"); break; case green: printf("green\n"); break; }
-
枚举类型更可以看做是宏定义的精简版,前者只能宏替换掉 int 类型和 unsigned int 类型;后者,可替换任意类型。
#define Monday 1 #define Tuesday 2 #define Wednesday 3 #define Thursday 4 #define Friday 5 #define Saturday 6 #define Sunday 7 ------------------------------------------ enum Day { Mon = 1, Tue, Wed, Thu, Fri, Sat, Sun } day;
What
枚举类型就是精简版的宏定义
emmm,这里打个比方哈,这枚举其实就有点像我们玩游戏时的那些小型增幅矩阵,对控制范围内的空间进行增幅强化,或是优化。
eg:将空间内的数字(1, 2, 3…)替换成设定好的名字 (red, blue, green…)
enum color {
red = 1, blue, green
};
此外,在C 语言中,枚举类型是被当做 int 或者 unsigned int 类型来处理的。
定义格式
enum Day {
Mon = 1, Tue, Wed, Thu, Fri, Sat, Sun
} day; // void;
enum Day {Mon = 1, Tue, Wed, Thu, Fri, Sat, Sun} day;
enum {
Mon = 1, Tue, Wed, Thu, Fri, Sat, Sun
} day; // 类似于结构体的定义规则
要注意:"{ }" 里面的是没有 “;”(分号)的。
枚举格式的语法
1.在定义时,"{ }" 内的变量都可以不进行初始化。第一个会默认为 “0”,后续的枚举变量会一次累加
2.任意一个位置的枚举变量被复制初始化后,后续的枚举都会在其基础上进行累加
enum day {
Mon0, Tue, Wed, Thu, Fri, Sat, Sun
};
>>> Mon = 0
Tue = 1
Wed = 2
Thu = 3
Fri = 4
Sat = 5
Sun = 6
----------------------------------------------
enum day {
Mon, Tue, Wed = 10, Thu, Fri, Sat, Sun
};
>>> Mon = 0
Tue = 1
Wed = 10
Thu = 11
Fri = 12
Sat = 13
Sun = 14
语句的编写位置
在这方面上,枚举和宏定义有些区别,枚举类型语句可以在任意位置编写代码,但宏定义只能在函数体之外进行编写。
对于这方面,可以认为是精简版带来的好处,就好比游戏中,小型增幅矩阵可以到处带着跑,大哥大只能家里蹲 : )
How
普通用法:
#include <stdio.h>
enum Day {
Mon = 1, Tue, Wed, Thu, Fri, Sat, Sun
};
int main(void) {
Day day;
day = Mon;
printf("day = %d\n", day);
return 0;
}
枚举遍历:
要注意:枚举能够遍历的前提是,枚举变量的大小必须是线性增加的
#include <stdio.h>
enum Day {
Mon = 1, Tue, Wed, Thu, Fri, Sat, Sun
};
int main(void) {
Day day;
for (day = Mon; day <= Sun; day++) {
printf("day = %d\n", day);
}
return 0;
}
>>>
day = 1
day = 2
day = 3
day = 4
day = 5
day = 6
day = 7
How To Good - 🙃???
如果想要精进某一类技能,就必须深入了解它的本质
What exactly is an enumeration type in a computer?
枚举类型在计算机中到底是什么?
在我们对枚举类型的变量进行 printf()
输出操作的时候,发现它对应的格式化语法是 “%d”,从这可以看出,C 语言将这种类型的变量当做 int 类型进行处理。
测试程序 - 1.0:
#include <stdio.h>
enum Day {
Mon = 1, Tue, Wed, Thu, Fri, Sat, Sun
};
int main(void) {
Day day;
day = Mon;
printf("day = %d\n", day);
printf("Mon = %d\n", Mon);
printf("sizeof(day) = %d\n", sizeof(day));
printf("sizeof(int) = %d\n", sizeof(int));
if (day == 1)
printf("enum == int");
else
printf("enum != int");
return 0;
}
>>> day = 1
Mon = 1
sizeof(day) = 4
sizeof(int) = 4
enum == int
从结果来看:
- 从 day == Mon 的值可以得出,定义时枚举体中的变量也属于枚举变量。对于 day 与 Mon 的区别,可能就只是 day 枚举变量是为了处理 Mon 类变量而存在的,就类似于操作指针的存在,不存在也没事,Mon 它们是可以直接使用的。
- enum 支持与 number 类的数据类型进行比较
- 枚举类型变量在内存中的大小和 (int) and (unsigned int) 的大小相等
测试程序 - 2.0:
enum Day {
Mon = -1, Tue, Wed, Thu, Sat, Sun
} day;
printf("Mon = %d\n", Mon);
printf("Tue = %d\n", Tue);
>>> Mon = -1
Tue = 0
从结果来看:
- enum 支持变量的值为 负,即:支持有符号
最后的唠叨:
枚举类型虽然被 C 语言视作 int or unsigned int 类型来处理,但是它们仍然是不同类型的,要注意类型的转换。
enum Day {Mon = 1, Tue, Wed, Thu, Fri} day;
int i = 10;
Fri = (enum Day) i;
以上的内容和思考,是单纯在阅读学习资料时所得的,肯定会存在很大的局限性,以及不足。到这里文章并没有完结,只是剩余的部分,需要我们自己用实践和经历去完善和补足!
大家加油 : )