C语言的枚举类型(Enum)

参考:C语言的枚举类型(Enum)
地址:https://blog.csdn.net/aliyonghang/article/details/123615803?spm=1001.2014.3001.5502

在实际编程中,有些数据的取值往往是有限的,只能是非常少量的整数,并且最好为每个值都取一个名字,以方便在后续代码中使用,比如一个星期只有七天,一年只有十二个月,一个班每周有六门课程等。

以每周七天为例,我们可以使用#define命令来给每天指定一个名字(宏替换):

#include <stdio.h>#define Mon 1#define Tues 2#define Wed 3#define Thurs 4#define Fri 5#define Sat 6#define Sun 7int main(){int day;scanf("%d", &day);switch(day){case Mon: puts("Monday"); break;case Tues: puts("Tuesday"); break;case Wed: puts("Wednesday"); break;case Thurs: puts("Thursday"); break;case Fri: puts("Friday"); break;case Sat: puts("Saturday"); break;case Sun: puts("Sunday"); break;default: puts("Error!");}return 0;}

运行结果:

输入:5输出:Friday

#define命令虽然能解决问题,但也带来了不小的副作用,导致宏名过多,代码松散,看起来总有点不舒服。C语言提供了一种枚举(Enum)类型,能够列出所有可能的取值,并给它们取一个名字。

枚举类型的定义形式为:

enum typeName{ valueName1, valueName2, valueName3, ...... };

enum是一个新的关键字,专门用来定义枚举类型,这也是它在C语言中的唯一用途;typeName是枚举类型的名字;valueName1, valueName2, valueName3, …是每个值对应的名字的列表。注意最后的;不能少。

例如,列出一个星期有几天:

enum week{ Mon, Tues, Wed, Thurs, Fri, Sat, Sun };

可以看到,我们仅仅给出了名字,却没有给出名字对应的值,这是因为枚举值默认从 0 开始,往后逐个加 1(递增);也就是说,week 中的 Mon、Tues … Sun 对应的值分别为 0、1 … 6。

我们也可以给每个名字都指定一个值:

enum week{ Mon = 1, Tues = 2, Wed = 3, Thurs = 4, Fri = 5, Sat = 6, Sun = 7 };

更为简单的方法是只给第一个名字指定值

enum week{ Mon = 1, Tues, Wed, Thurs, Fri, Sat, Sun };

这样枚举值就从 1 开始递增,跟上面的写法是等效的。

枚举是一种类型,通过它可以定义枚举变量:

enum week a, b, c;

也可以在定义枚举类型的同时定义变量:

enum week{ Mon = 1, Tues, Wed, Thurs, Fri, Sat, Sun } a, b, c;

有了枚举变量,就可以把列表中的值赋给它:

enum week{ Mon = 1, Tues, Wed, Thurs, Fri, Sat, Sun };enum week a = Mon, b = Wed, c = Sat;

或者:

enum week{ Mon = 1, Tues, Wed, Thurs, Fri, Sat, Sun } a = Mon, b = Wed, c = Sat;

【示例】判断用户输入的是星期几。

#include <stdio.h>int main(){enum week{ Mon = 1, Tues, Wed, Thurs, Fri, Sat, Sun } day;scanf("%d", &day);switch(day){case Mon: puts("Monday"); break;case Tues: puts("Tuesday"); break;case Wed: puts("Wednesday"); break;case Thurs: puts("Thursday"); break;case Fri: puts("Friday"); break;case Sat: puts("Saturday"); break;case Sun: puts("Sunday"); break;default: puts("Error!");}return 0;}

运行结果:

输入:4输出:Thursday

需要注意的两点是:

  1. 枚举列表中的 Mon、Tues、Wed 这些标识符的作用范围是全局的(严格来说是 main() 函数内部),不能再定义与它们名字相同的变量。

  2. Mon、Tues、Wed 等都是常量,不能对它们赋值,只能将它们的值赋给其他的变量。

枚举和宏其实非常类似:宏在预处理阶段将名字替换成对应的值,枚举在编译阶段将名字替换成对应的值。我们可以将枚举理解为编译阶段的宏。

对于上面的代码,在编译的某个时刻会变成类似下面的样子:

#include <stdio.h>int main(){enum week{ Mon = 1, Tues, Wed, Thurs, Fri, Sat, Sun } day;scanf("%d", &day);switch(day){case 1: puts("Monday"); break;case 2: puts("Tuesday"); break;case 3: puts("Wednesday"); break;case 4: puts("Thursday"); break;case 5: puts("Friday"); break;case 6: puts("Saturday"); break;case 7: puts("Sunday"); break;default: puts("Error!");}return 0;}

Mon、Tues、Wed 这些名字都被替换成了对应的数字。这意味着,Mon、Tues、Wed 等都不是变量,它们不占用数据区(常量区、全局数据区、栈区和堆区)的内存,而是直接被编译到命令里面,放到代码区,所以不能用&取得它们的地址。这就是枚举的本质。

case 关键字后面必须是一个整数,或者是结果为整数的表达式,但不能包含任何变量,正是由于 Mon、Tues、Wed 这些名字最终会被替换成一个整数,所以它们才能放在 case 后面。

枚举类型变量需要存放的是一个整数,我猜测它的长度和 int 应该相同,下面来验证一下:

#include <stdio.h>int main(){enum week{ Mon = 1, Tues, Wed, Thurs, Fri, Sat, Sun } day = Mon;printf("%d, %d, %d, %d, %d\n", sizeof(enum week), sizeof(day), sizeof(Mon), sizeof(Wed), sizeof(int) );return 0;}

运行结果:

4, 4, 4, 4, 4

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

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

相关文章

【HDOJ】1597 find the nth digit

二分。 1 #include <stdio.h>2 #include <math.h>3 4 int main() {5 int case_n;6 double n, tmp, l, r;7 int m;8 9 scanf("%d", &case_n); 10 11 while (case_n--) { 12 scanf("%lf", &n); 13 …

(水题)洛谷 - P1603 - 斯诺登的密码

https://www.luogu.org/problemnew/show/P1603 有毒&#xff0c;大小写不检测&#xff0c;句号也不管。 #include<bits/stdc.h> using namespace std; #define ll long longint num[10]; int top0;char s[30];int tonum(){int nstrlen(s);if(strcmp(s,"one")0)…

用SHA1或MD5 算法加密数据(示例:对用户身份验证的简单实现)

(一).功能 用哈希算法: SHA1或MD5 实现用户账号和密码验证. 数据库存储实现原理是: 用户账号直接存储在数据库中&#xff0c;密码经过加密后再存储到数据库中. 当用户登录时&#xff0c;密码要经过加密后再与数据库中的实际存储密码比较&#xff0c;确定是否合法用户…

https网络编程——HTTP协议的简介、HTTP报文结构和代理、HTTP加速解析方法(哈希加速、协议状态机)

参考&#xff1a;HTTP协议的简介及其工作原理等 地址&#xff1a;https://qingmu.blog.csdn.net/article/details/108046553?spm1001.2014.3001.5502 目录HTTP协议的简介及其工作原理1、HTTP简介1.1、什么是超文本&#xff08;HyperText&#xff09;?1.2、什么是URL&#xff…

vim常用命令表

命令模式光标移动h或向左方向键光标向左移动一个字符j或向下方向键光标向下移动一个字符k或向上方向键光标向上移动一个字符l或向右方向键光标向右移动一个字符Ctrlf屏幕向前翻一页&#xff08;常用&#xff09;Ctrlb屏幕向后翻一页&#xff08;常用&#xff09;Ctrld屏幕向前翻…

c# 2.0 Factory的实现

用C#的范型建立一个Factory模式的模板: publicstructFactoryConverter<A, B>{ public static implicit operator A(FactoryConverter<A, B> conv) { return Activator.CreateInstance<A>(); } public static implici…

C++11 —— 简易的旋转锁类

简易的旋转锁 使用 C11 的原子操作&#xff0c;实现的简易旋转锁&#xff08;xspinlock.h&#xff09;&#xff1a; /*** file xspinlock.h* <pre>* Copyright (c) 2019, Gaaagaa All rights reserved.* * 文件名称&#xff1a;xspinlock.h* 创建日期&#xff1a;2019…

https网络编程——openssl安装(两个软链接库libssl、libcrypto)、openssl命令行方式实现CA和证书、介绍SSH

参考&#xff1a;openssl安装方式&#xff08;Ubuntu下&#xff09; 地址&#xff1a;https://qingmu.blog.csdn.net/article/details/115454254?spm1001.2014.3001.5502 目录官方网站1、解压2、编译安装3、生成软连接(两个库)4、测试这是B站openssl视频教程&#xff1a;https…

添加IFrame导致内存溢出的解决过程(IE浏览器,目前发现了原因,还未解决)...

1、 现象 每次动态添加iframe时,iexplore.exe进程占据的内存都会增加&#xff08;大概10M左右&#xff09;&#xff0c;不会自动释放&#xff0c;最终导致内存溢出 2、 解决过程 经过网络的一番搜索&#xff0c;基本上给出的解决方案是清空iframe内容&#xff0c;并移除ifram…

[spring boot] 01 环境搭建 - 配置java和mvn环境

主要内容&#xff1a; 一、IntelliJ IDEA 安装 二、maven 安装 三、设置IDEA和mvn的关系 一、IntelliJ IDEA 安装 1.1. 下载编辑器&#xff1a;前往下载 (Ultimate和Community都是可以的&#xff0c;我一般下载前一个) 1.2. 注册码记得搜索 二、maven 安装 2.1. 下载mvn&#x…

https网络编程——HTTPS简介以及SSL协议详解

参考;HTTPS简介以及SSL协议详解 地址&#xff1a;https://qingmu.blog.csdn.net/article/details/108209248?spm1001.2014.3001.5502 目录1.HTTPS简介2.SSL协议介绍2.1、SSL协议的功能2.2、SSL协议在协议栈的位置2.3、SSL协议组成2.3.1、纪录协议的功能2.3.2、SSL记录协议的示…

linux开机和登陆欢迎信息

这篇文章看似没啥技术含量&#xff0c;但却是非常实用的一个小技巧&#xff0c;通常在面临下面几个问题时就可以显示其意义了&#xff1a;1&#xff09;当你维护的服务器数量较多&#xff08;例如&#xff1a;十几台或更多&#xff09;&#xff0c;希望知道每台服务器的信息时&…

BookSmart Self Publishing

美国Blurb网站推出针对博客用户的自助出书软件已经不是什么新闻 &#xff0c;接下来传出日本人兴“个人出书” 出版社“量体裁衣”,其实去年 “自助出版”就已经进军中国&#xff1b;现在有发现两个国内版的booksmart&#xff0c;一个是麦客&#xff0c;一个是印客,前者是杭州的…

D3---01基础的柱状图制作(转)

---文章转自 http://d3.decembercafe.org/index.html &#xff0c;Created by 十二月咖啡馆。 一个完整的柱形图包含三部分&#xff1a;矩形、文字、坐标轴。 首先要布置一个大小合适的 SVG 画布&#xff1a; 添加 SVG 画布 //画布大小 var width 400; var height 400;//在…

常用UI控件之UIControl

1.UIControl概述UIControl继承于UIView,其子类 有:UIButton,UITextField,UISegmentedControl(分段控件),UISlider(滑块控件),UISwitch(开关控件),UIPageControl(分页控件)2.UISegmentedControl(分段控件)UIsegmentedControl中的每个segment都点击,相当于集成了多个UIButton,点击…

https网络编程——对称加密、非对称加密、单项加密的简单介绍

参考&#xff1a;对称加密、非对称加密、单项加密的简单介绍 地址&#xff1a;https://qingmu.blog.csdn.net/article/details/108213426?spm1001.2014.3001.5502 目录1、对称加密1.1、什么是对称加密&#xff1f;1.2、对称加密的优缺点是什么&#xff1f;1.3、常见的对称加密…

dnn中个性化服务的使用

1.什么是profiles(个性化服务)Profiles是系统面向用户提供的灵活性的个体信息的容器&#xff0c;一个用户的Profile可以使以下一种或多种的集合&#xff1a; &#xff08;1&#xff09; 简单的字符串或其他基础类型 &#xff08;2&#xff09; 一个序列化的实体 &#xff08;3&…

洛谷P1073 Tarjan + 拓扑排序 // 构造分层图

https://www.luogu.org/problemnew/show/P1073 C国有 n n个大城市和 mm 条道路&#xff0c;每条道路连接这 nn个城市中的某两个城市。任意两个城市之间最多只有一条道路直接相连。这 mm 条道路中有一部分为单向通行的道路&#xff0c;一部分为双向通行的道路&#xff0c;双向通…

昨日观看《龙虎门》

本来很想看《谍中谍3》的&#xff0c;想看看汤姆克鲁斯的风采。不过还是选择的《龙虎门》&#xff0c;早就看过介绍说《龙虎门》主要是给人视觉上的冲击&#xff0c;注重打斗。故事的情节比较简单&#xff0c;两兄弟碰面&#xff0c;大哥决定和自己的老大退出江湖引发上面帮派的…

zabbix2.2.3 VMware Vsphere exsi监控配置步骤

zabbix2.2.3 VMware Vsphere exsi监控配置步骤 zabbix2.2.3 VMware Vsphere exsi监控配置步骤,1,添加监控主机2,添加聚集macro;{$PASSWORD} yoodo.com{$URL} http://ip/sdk{$USERNAME} root3,关联监控模板模板用Template Virt VMware;posted on 2014-04-30 10:22 秦瑞It行程…