C语言基础入门48篇_43-枚举enum(枚举的本质是数字、类似于switch、更直观、标志变量、非基本数据类型)

给出一个集合,你只能从这个集合中选择一个值,不能随便去选择值,当限定用户只能从中选一个值的时候需要使用到枚举。

1. 标志变量

在某些编程情况下,我们可能会根据某个变量决定使用多分支中某一个的情况,我们常使用一个标志变量存储分支的状态。
如以下的代码中nChoice即为标志变量,根据其输入的值通过switch函数决定对应的case。

#include <stdio.h>

int main(int argc, char* argv[])
{
	int nChoice = -1;
	scanf("%d", &nChoice);
	switch (nChoice)
	{
	case 0:
		printf("选择0号菜单,运行增加功能……\r\n");
		break;
	case 1:
		printf("选择1号菜单,运行删除功能……\r\n");
		break;
	case 2:
		printf("选择2号菜单,运行查询功能……\r\n");
		break;
	}
	return 0;
}

在这里插入图片描述
但是,单纯的数字的可读性并不好,这时,我们可以采用枚举变量,增强可读性。

2. 枚举

枚举也是一个非基本数据类型,即需要使用相应的关键字定义出新类型,再用新类型定义出相应的变量。

枚举的关键字是enum,同struct、union类似,我们需要定义出新的枚举类型,再用枚举类型去定义枚举变量。

//enum为关键字 FLAG_CHOICE为枚举类型名     
//ADD,DEL,QUERY为各状态
enum FLAG_CHOICE{
    ADD,
    DEL,
    QUERY
};

整体代码:

#include <stdio.h>

enum FLAG_CHOICE {
	ADD,
	DEL,
	QUERY
};

int main(int argc, char* argv[])
{
	FLAG_CHOICE eChoice;
	scanf("%d", &eChoice);
	switch (eChoice)
	{
	case ADD:
		printf("选择0号菜单,运行增加功能……\r\n");
		break;
	case DEL:
		printf("选择1号菜单,运行删除功能……\r\n");
		break;
	case QUERY:
		printf("选择2号菜单,运行查询功能……\r\n");
		break;
	}
	return 0;
}

运行结果:
输入数字执行对应的case下的指令, 输入"2"后输出对应的QUERY case下的事件。
在这里插入图片描述
枚举的代码与上述使用switch的效果一样,但是可读性更高。

3.枚举的限制

可以看出,使用enum声明类型时,同时需要声明这个类型下支持的各种“状态”。
之后定义的枚举变量,将只能被限定的状态赋值:

#include <stdio.h>

enum 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.学习笔记:枚举的笔记

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

十月旧城

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值