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;所以本章最后通过…

【JavaWeb】Request(学习笔记)

一、Request概述 1、request对象和response对象的原理 tomcat服务器会根据请求u1中的资源路径&#xff0c;创建对应的ServletDemo1对象tomcat 服务器&#xff0c;会创建request对象和response对象&#xff0c;request对象中封装请求消息数据tomcat将request和response两个对象…

18个非技术面试题

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

为什么参数上必须加@RequestBody?

PostMapping("/login")public Result<Map<String,Object>> login(RequestBody User user){return Result.success();} 在这个 PostMapping("/login") 的控制器方法中&#xff0c;使用 RequestBody 注解的目的是将请求体中的 JSON 数据映射到方…

函数柯里化 剖析

定义一个函数&#xff0c;以闭包的方式内部函数调用外部函数,并返回内部函数 function calc(n){ //args是获取的第一次参数的值let argsArray.prototype.slice.call(arguments)// 上面的args写法等同于下方的for循环// for (var i 0; i < arguments.length; i) {// A…

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…

设计模式-GOF对各个模式的定义

以下内容是对设计模式之父GOF的著作《设计模式——可复用面向对象软件的基础》定义的摘抄 1 抽象工厂 意图 提供一个接口以创建一系列相关或相互依赖的对象&#xff0c;而无须指定它们具体的类。 适用性 在以下情况下使用抽象工厂模式&#xff1a; 一个系统要独立于它的产…

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

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

ReactHooks大全—useState

React Hooks是React 16.8版本引入的一种新的编程范式&#xff0c;它可以让我们在不使用class的情况下&#xff0c;使用state和其他React特性&#xff0c;。React Hooks的出现&#xff0c;不仅提高了函数组件的功能和复用性&#xff0c;也简化了组件的编写和维护&#xff0c;让我…

Spring 依赖查找知识点总结

前言 源码在我github的guide-spring仓库中&#xff0c;可以克隆下来 直接执行。 我们本文主要来介绍依赖查找的使用示例 依赖查找 什么是依赖查找 依赖查找并不是 Spring 框架特有的概念&#xff0c;它是一种在软件开发中获取依赖对象的方式。它通常用于获取运行时需要的服…

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; 当一个类不知道它所必须创建的对象的类的时候。当一个类希望由它的子类来指定它所创建的对象的时候。当类将创建对象的职责委托给多个帮助子…

PCL 已知同名点对计算旋转矩阵并对点云进行旋转

目录 一、 算法概述二、代码实现三、测试示例一、 算法概述 适用:已知三组及三组以上的同名点对,计算旋转矩阵;然后根据旋转矩阵对点云进行旋转,最后保存旋转后的点云文件。 二、代码实现 #include <Eigen/Core> #include <Eigen/Dense>

c++程序设计定义一个MyString类,实现两个字符串连接。要求定义类的数据成员为字符指针,实现深拷贝函数。

定义一个MyString类&#xff0c;实现两个字符串连接。要求定义类的数据成员为字符指针&#xff0c;实现深拷贝函数。 要求&#xff1a;不能使用<string>,可以使用<cstring>中的 strcpy 、strcat、strcmp以及strlen( )等函数 已知测试函数如下&#xff1a; int m…

持久化存储 StorageClass

kubernetes从v1.4版本开始引入了一个新的资源对象StorageClass&#xff0c;用于标记存储资源的特性和性能。到v1.6版本时&#xff0c;StorageClass和动态资源供应的机制得到了完善&#xff0c;实现了存储卷的按需创建&#xff0c;在共享存储的自动化管理进程中能够实现了重要的…

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中批量注释的步…