目录
C语言中的自定义类型有:结构? ?位段? ?枚举? ?联合
枚举顾名思义就是一一列举,把可能的取值一一列举。
比如我们现实生活中:一周的星期一到星期日是有限的7天,可以一一列举。性别有:男、女、保密,也可以一一列举。月份有12个月,也可以一一列举
枚举定义:
enum Day//星期
{
//枚举的可能取值
//枚举的可能取值都是常量,不可修改
Mon, //注意是逗号
Tues,
Wed,
Thur,
Fri,
Sat,
Sun //结尾并没有;
};
enum Sex//性别
{
MALE,
FEMALE,
SECRET
};
enum Color//颜色
{
RED,
GREEN,
BLUE
};
以上定义的 enum Day , enum Sex , enum Color 都是 枚举类型 。{} 中的内容是枚举类型的可能取值,也叫 枚举常量 (常量不可修改但是可以赋初值) ?。这些可能取值都是有值的,默认从 0 开始,一次递增 1。当然在定义的时候也可以赋初值。
enum Color//颜色
{
RED = 1,
GREEN = 2,
BLUE = 4
};
// 某个值复制后,后面的值如果没有赋值默认增加1。
enum Color//颜色
{
RED = 1,
GREEN,//2
BLUE //3
};
定义一个枚举类型的变量:
#include<stdio.h>
enum Color//颜色
{
RED,
GREEN,
BLUE
};
int main()
{
enum Color col = RED;
printf("%d", col); //打印RED的值为0
return 0;
}
既然RED的值为0,那我们能否将0赋值给col呢?enum Color col = 0;//这样是否可行呢?
运行之后,我的编译器编译成功而且顺利运行。
但是并不代表这个语法在所有编译器下都是正确的。这取决与编译器对语法的容忍程度。
所以,只能拿枚举常量给枚举变量赋值,才不会出现类型的差异。
之前计算结构体的大小时,结构体的成员都有明确的类型,结合内存对齐的知识就可以得到结构体的大小。而我们发现枚举里的成员都是常量没有类型,甚至貌似都没有一条完整的语句,那该如何计算呢?
printf("%d", sizeof(enum Color));
运行之后,其结果是4。
解释:回顾之前介绍枚举类型,枚举{}里面所列的是枚举的可能取值。
例如定义该枚举类型的变量:
enum Color col = BLUE;
col只能是{}中枚举的可能取值中的任意一个。
而之所以结果是4,是因为在我所使用的编译器下常量大小为4字节。
1. 增加代码的可读性和可维护性
2. 和 #define 定义的标识符相比较,枚举有类型检查,更加严谨。
3. 防止了命名污染(封装)
4. 便于调试
5. 使用方便,一次可以定义多个常量
此外,今后我们利用枚举来设置程序的菜单会显得更加美观。