1. 标志变量
在某些编程情况下,我们可能会根据某个变量决定使用多分支中某一个的情况,我们常使用一个标志变量存储分支的状态。
如以下的代码中nChoice即为标志变量,根据其输入的值通过switch函数决定对应的case。
#includeint main(int argc, char* argv[]) { int nChoice = -1; scanf("%d", &nChoice); switch (nChoice) { case 0: printf("选择0号菜单,运行增加功能……rn"); break; case 1: printf("选择1号菜单,运行删除功能……rn"); break; case 2: printf("选择2号菜单,运行查询功能……rn"); break; } return 0; }
但是,单纯的数字的可读性并不好,这时,我们可以采用枚举变量,增强可读性。
2. 枚举
枚举也是一个非基本数据类型,即需要使用相应的关键字定义出新类型,再用新类型定义出相应的变量。
枚举的关键字是enum,同struct、union类似,我们需要定义出新的枚举类型,再用枚举类型去定义枚举变量。
//enum为关键字 FLAG_CHOICE为枚举类型名
//ADD,DEL,QUERY为各状态
enum FLAG_CHOICE{
ADD,
DEL,
QUERY
};
整体代码:
#includeenum FLAG_CHOICE { ADD, DEL, QUERY }; int main(int argc, char* argv[]) { FLAG_CHOICE eChoice; scanf("%d", &eChoice); switch (eChoice) { case ADD: printf("选择0号菜单,运行增加功能……rn"); break; case DEL: printf("选择1号菜单,运行删除功能……rn"); break; case QUERY: printf("选择2号菜单,运行查询功能……rn"); break; } return 0; }
运行结果:
输入数字执行对应的case下的指令, 输入"2"后输出对应的QUERY case下的事件。
枚举的代码与上述使用switch的效果一样,但是可读性更高。
3.枚举的限制:
可以看出,使用enum声明类型时,同时需要声明这个类型下支持的各种“状态”。
之后定义的枚举变量,将只能被限定的状态赋值:
#includeenum FLAG_CHOICE{ ADD, DEL, QUERY }; int main(int argc, char* argv[]) { FLAG_CHOICE myChoice; myChoice = ADD; //合法 myChoice = DEL; //合法 myChoice = QUERY; //合法 myChoice = 5; //非法 return 0; }
整个运行之后可以看到,myChoice的值为QUERY(2)
4. 枚举的本质是数字
运行上面的代码,输入2后可以看到对应的地址下的值为2,4个字节的int型。
从以上代码中可以看到
FLAG_CHOICE myChoice;
scanf("%d", &myChoice);
这是可以编译通过的,因为枚举的本质其实就是整型类型。
只不过定义枚举类型后,编译器会做两件事情:
- 在枚举类型声明时,将各状态转为数字(从下标0开始)
- 在枚举变量赋值时,会做强制类型检查,枚举类型声明时没有的状态(数字),不得赋值
正因为如此,枚举类型声明时,还可以指定数字编号
enum FLAG_CHOICE{
ADD = 2,
DEL = 1,
QUERY = 0
};
运行之后:输入0就执行了对应case的指令
5.学习视频地址:枚举(枚举的本质是数字、类似于switch、更直观、标志变量)
6.学习笔记:枚举的笔记



