C语言之枚举类型

目录

枚举类型

枚举常量

枚举类型的特征

 命名空间


本节我们来学习表示一定整数值的集合的枚举类型。

枚举类型

老样子,我们先用一段程序引出:

/*显示所选动物的叫声*/
#include<stdio.h>enum animal {Dog, Cat, Monkey, Invalid};
/*显示狗叫*/
void dog(void)
{puts("汪汪!!");
}
/*显示猫叫*/
void cat(void)
{puts("喵喵!!");
}
/*显示猴叫*/
void monkey(void)
{puts("唧唧!!");
}
/*选择动物*/
enum animal select()
{int tmp;do{printf("0—狗 1—猫 2—猴 3—结束");scanf("%d", &tmp);}while(tmp < Dog || tmp > Invalid);return tmp;
}
int main()
{enum animal selected;do{switch(selected = select()){case Dog :dog();break;case Cat :cat();break;case Monkey :monkey();break;}}while(selected != Invalid);return 0;
}

让我们来分析下这段程序:

下面紫色底纹部分是枚举类型的声明,它表示了所有可用值的集合,其中,animal被称为枚举名,写在{ }中的是枚举常量

enum animal {Dog, Cat, Monkey, Invalid};

以枚举类型animal为例,如下图,各枚举常量依次被赋值为0,1, 2,3.

相对于整形能够自由的表示多种类型的整数,枚举类型只能表示有限的数值,而且个数值都会被赋予名称。

另外,枚举名不是类型名,也就是说,类型名不是animal型而是enum animal型。

enum animal selected;

上面上enum animal型变量selected的声明,通过这个声明定义了变了selected的取值范围为0,1,2,3

从下图看,无论是int型还是枚举类型,变量声明的形式都是类型名 标识符

select函数的功能是显示动物选项并且返回所选动物,在使用do语句的循环条件表达式,其中使用了枚举常量Invalid(意为“无效的”)不表示任何含义,那么我们去掉它看看会发生什么情况:

循环条件改为:

tmp < Dog || tmp > Monkey + 1

如果加入第4种动物海豹,则循环条件改为:

tmp < Dog || tmp > Seal + 1

即每次增加动物时,都要修改判断循环条件的循环条件表达式,由此可见,看似无用的Invalid实际上有大用处!

枚举常量的数据类型时int型,因此在返回值类型为enum animal型的select函数中,可以返回int型变量tmp的值,为了保险,我们可以将返回值进行如下强制转换:

	return (enum animal)tmp;

枚举常量

在上面中,我们按照从0开始的顺序为枚举常量定义了相应的整数值,相应的这些值也能根据需要任意设置,只要在枚举常量的名称后面写上赋值运算符=和值就够了

例如在以下定义种,Fukuoka为0,Saga = 5,Nagasaki为6

enum kyushu {Fukuo, Saga = 5, Nagasaki};

没有给定的枚举常量,其值前为一个枚举常量加1。

如果进行以下声明,那么Shibata和Washio都为0(多个枚举类型允许拥有同样的值)

enum namae {Shibata, Washio = 0};

程序的枚举名也是可以省略的:

enum month {JANUARY = 1, FEBRUARY = 2,/*中略*/, DECEMBER};

通过这种方式声明的枚举常量,可以在如下所示的Switch语句中使用

int month;
/*………………*/
switch(month)
{case JANUARY:
case FEBRUARY:/*— 略—*/
}

枚举类型的特征

使用宏定义实现上面表示月份的枚举类型:

#define JANUARY 1
#define FEBRUARY 2
/*…略…*/
#define DECEMBER 12

这在程序中会占据12行,并且还有逐个定义它们的值

而使用枚举类型来声明,就可以十分简洁,只要JANUARY的值正确,其他值就不会错。

■表示动物的enum animal型,只有定义过的值才有效,即有效值为0、1、2、3,如果变量an是该类型,那么对于一下赋值语句

an = 5;//所赋的值不正确

在一些人性化的编译器将会发出警告信息,提醒赋值给an是未定义的值,这样就更容易发现程序中的错误,但是对于an是int型变量,就不能进行这种检测。

注意:能用枚举类型表示的数据类型,应尽量用枚举类型来表示。


命名空间

枚举名和变量名分别属于不同的命名空间(name space),因此几遍名称相同也能区分,比如人名的中华和地理意义上的中华,虽然名字相同但是性质不同,所以可以区分清楚,如果说我是中华民族的一份子,我们就可以马上明了了。

因此,我们可以将enum animal型的变量名为animal,进行如下声明:

enum animal animal;//声明enum animal型的变量animal

显然,前一个animal是枚举名,后一个animal是变量名

下面,我们将学习新的知识——函数递归。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/229728.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Zotero攻略

给大家分享一下我对于Zotero的使用。 1、下载链接 Zotero | Your personal research assistant 进入后直接下载即可 2、一些好用的插件 &#xff08;1&#xff09;Zotero Connector 下载地址&#xff1a;Zotero | Connectors 超级好用&#xff01;不用一篇一篇下PDF了&am…

Redis设计与实现之事务

一、事务 Redis 通过 MULTI 、DISCARD 、EXEC 和 WATCH 四个命令来实现事务功能&#xff0c;本章首先讨 论使用 MULTI 、DISCARD 和 EXEC 三个命令实现的一般事务&#xff0c;然后再来讨论带有 WATCH 的事务的实现。 因为事务的安全性也非常重要&#xff0c;所以本章最后通过…

18个非技术面试题

请你自我介绍一下你自己&#xff1f; 这道面试题是大家在以后面试过程中会常被问到的&#xff0c;那么我们被问到之后&#xff0c;该如果回答呢&#xff1f;是说姓名&#xff1f;年龄&#xff1f;还是其他什么&#xff1f; 最佳回答提示&#xff1a; 一般人回答这个问题往往会…

neuq-acm预备队训练week 9 P1119 灾后重建

解题思路 本题可以用最短路算法——Floyd AC代码 #include<bits/stdc.h> #define inf 1e9 using namespace std; const int N 2e2 50; int n, m, q, now 0, a, b, c, t[N], G[N][N];int main() {scanf("%d%d", &n, &m);for(int i 0;i<n;i)sc…

2023新时代中国模特大赛总决赛在京落幕

12月16日&#xff0c;备受瞩目的2023新时代中国模特大赛圆满落幕。本次大赛旨在挖掘和培养具有新时代特色的模特人才&#xff0c;推动中国时尚产业的创新发展。 作为中国时尚界的重要赛事&#xff0c;新时代中国模特大赛吸引了来自全国各地的优秀模特选手45名参加全国总决赛。在…

The Grid – Responsive WordPress Grid响应式网格插件

点击阅读The Grid – Responsive WordPress Grid响应式网格插件原文 The Grid – Responsive WordPress Grid响应式网格插件是一个高级 wordpress 网格插件&#xff0c;它允许您在完全可定制且响应迅速的网格系统中展示任何自定义帖子类型。 Grid WordPress 非常适合展示您的博…

QT信号、槽机制介绍与实现

时间记录&#xff1a;2023/12/17 1.介绍 QT中进行对象之间事件的处理机制为信号、槽机制&#xff0c;即一个对象状态改变时发出信号&#xff0c;然后与此信号进行绑定的对应槽便会被触发&#xff0c;类似于c/c里面的回调函数机制 2.信号 在一定情况下被发射的事件&…

【TB作品】51单片机,语音出租车计价器

西交大题目 1.语音出租车计价器 一、功能要求: 1.具有可模拟出租车车轮转速传感器的硬件设计,可计量出租车所走的公 里数。 2.显示和语音播报里程、价格和等待红灯或堵车的计时价格: 3.具有等待计时功能 4.具有实时年月日显示和切换功能。 5.操作简单、界面友好。 二、设计建议…

08-工厂方法

意图 定义一个用于创建对象的接口&#xff0c;让子类决定实例化哪一个类 类图 适用性 在下列情况可以使用工厂方法模式&#xff1a; 当一个类不知道它所必须创建的对象的类的时候。当一个类希望由它的子类来指定它所创建的对象的时候。当类将创建对象的职责委托给多个帮助子…

ELK(八)—Metricbeat部署

目录 介绍修改配置文件启动 Modulenginx开启状态查询配置Nginx module查看是否配置成功 介绍 Metricbeat 是一个轻量级的开源度量数据收集器&#xff0c;用于监控系统和服务。它由 Elastic 公司开发&#xff0c;并作为 Elastic Stack&#xff08;Elasticsearch、Logstash、Kiba…

【Linux】在vim中批量注释与批量取消注释

在vim编辑器中&#xff0c;批量注释和取消注释的操作可以通过进入V-BLOCK模式、选择要注释或取消注释的内容、输入注释符号或选中已有的注释符号和按键完成。这些操作可以大大提高代码或文本的编写和修改效率&#xff0c;是vim编辑器中常用的操作之一。 1.在vim中批量注释的步…

[elementPlus] teleported 在 ElSubMenu中的用途

如图 一个菜单对应的路由结构如上图 如果做适配窄屏幕 如果在 <ElSubMenu :index"route.path" >中不加入 teleported 就会出现问题 加上就OK了 <ElSubMenu :index"route.path" teleported>

力扣200. 岛屿数量(java DFS解法)

Problem: 200. 岛屿数量 文章目录 题目描述思路解题方法复杂度Code 题目描述 思路 该问题可以归纳为一类遍历二维矩阵的题目&#xff0c;此类中的一部分题目可以利用DFS来解决&#xff0c;具体到本题目&#xff1a; 1.我们首先要针对于二维数组上的每一个点&#xff0c;尝试展…

单片机期末复习

前言 发现很多人都写了单片机原理及接口技术课后习题的答案&#xff0c;但是也就只写了答案而已&#xff0c;可能是他们觉得太简单的缘故吧&#xff0c;我这里对此进行一下我近段时间复习的总结&#xff0c;本篇博客只展示选择题、填空题和判断题的答案&#xff0c;仅供参考&a…

饥荒Mod 开发(十一):修改物品堆叠

饥荒Mod 开发(十)&#xff1a;制作一把AOE武器 饥荒Mod 开发(十二)&#xff1a;一键制作 饥荒中物品栏有限&#xff0c;要拾取的物品有很多&#xff0c;经常装不下要忍痛丢掉各种东西&#xff0c;即使可以将物品放在仓库但是使用不方便&#xff0c;所以可以将物品的堆叠个数设…

1264. 动态求连续区间和(树状数组---某个位置加上一个数/求在线(动态)前缀和/蓝桥杯)

题目&#xff1a; 输入样例&#xff1a; 10 5 1 2 3 4 5 6 7 8 9 10 1 1 5 0 1 3 0 4 8 1 7 5 0 4 8输出样例&#xff1a; 11 30 35 树状数组&#xff1a; 代码&#xff1a; #include<cstdio> #include<iostream> using namespace std;const int N100010; int n,…

系统架构设计师教程(七)系统架构设计基础知识

系统架构设计基础知识 7.1 软件架构概念7.1.1 软件架构的定义7.1.2 软件架构设计与生命周期需求分析阶段设计阶段实现阶段构件组装阶段部署阶段后开发阶段 7.1.3 软件架构的重要性 7.2 基于架构的软件开发方法7.2.1 体系结构的设计方法概述7.2.2 概念与术语7.2.3 基于体系结构的…

深度剖析JavaScript中冒泡和捕获机制、事件代理

JS事件传播的两种机制包括冒泡和捕获&#xff0c;下面将具体剖析它们之间本质的区别。 事件冒泡: 先触发子元素的事件&#xff0c;再触发父元素的事件。 创建一个 ul label 和 li label, 分别绑定一个父id 和 子 id, 再通过创建 script&#xff0c;去绑定各自的点击事件。 <…

阿里云|人工智能(AI)技术解决方案

函数计算部署Stable Diffusion AI绘画技术解决方案 通过函数计算快速部署Stable Diffusion模型为用户提供快速通过文字生成图片的能力。该方案通过函数计算快速搭建了AIGC的能力&#xff0c;无需管理服务器等基础设施&#xff0c;专注模型的能力即可。该方案具有高效免运维、弹…

设计模式——责任链模式(行为模式)

引言 责任链模式是一种行为设计模式&#xff0c; 允许你将请求沿着处理者链进行发送。 收到请求后&#xff0c; 每个处理者均可对请求进行处理&#xff0c; 或将其传递给链上的下个处理者。 问题 假如你正在开发一个在线订购系统。 你希望对系统访问进行限制&#xff0c; 只允…