C语言的枚举类型(Enum)

2023-11-05

参考: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 7
 
int 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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C语言的枚举类型(Enum) 的相关文章

  • 让CHAT介绍下V2ray

    CHAT回复 V2Ray是一个网络工具 主要用于科学上网和保护用户的网络安全 它的名字源自Vmess Ray 光线 通过使用新的网络协议 为用户提供稳定且灵活的代理服务 下面是一些V2Ray的主要特性 1 多协议支持 V2Ray 提供了大量
  • 基于java的婴幼儿产品销售系统设计与实现

    基于java的婴幼儿产品销售系统设计与实现 I 引言 A 研究背景和动机 婴幼儿产品销售系统是针对婴幼儿家庭的产品销售平台 该系统的设计需要满足安全 便捷 高效等多个方面的要求 针对该系统 我们可以采用基于Java的Web框架搭建 主要分为
  • 用CHAT分析高校体育智慧教学体系构建与探索研究现状

    CHAT回复 现阶段 高校体育智慧教学体系的构建与探索研究还处于初级阶段 但全球数字化转型大潮的推动下 一些较为前沿的研究和实践已经开始出现 1 教学平台的建设 很多高校已经开始尝试使用在线教育平台进行体育教学 把传统的面对面授课模式转变为
  • 基于java的学生成绩在线管理系统设计与实现

    基于java的学生成绩在线管理系统设计与实现 I 引言 A 研究背景和动机 基于Java的学生成绩在线管理系统设计与实现的研究背景和动机是设计一个可以方便管理学生成绩的系统 该系统可以方便地记录学生的成绩 并为老师和学生提供查询和统计功能
  • 基于java的物流信息网系统设计与实现

    基于java的物流信息网系统设计与实现 I 引言 A 研究背景和动机 基于Java的物流信息网系统设计与实现的研究背景和动机 随着互联网的普及和电子商务的快速发展 物流信息网系统已成为现代物流管理的重要组成部分 物流信息网系统能够实现物流信
  • 【计算机毕业设计】电商个性化推荐系统

    伴随着我国社会的发展 人民生活质量日益提高 于是对电商个性化推荐进行规范而严格是十分有必要的 所以许许多多的信息管理系统应运而生 此时单靠人力应对这些事务就显得有些力不从心了 所以本论文将设计一套电商个性化推荐系统 帮助商家进行商品信息 在
  • 【计算机毕业设计】毕业生就业管理微信小程序_lm9q0

    腾讯公司在2017年1月19日发布了一款不需要下载 不需要卸载 不需要存储的软件叫微信小程序 受到了很多人的喜欢 微信小程序自2017年发布至今 依托微信的社交属性和庞大的用户基数 已经渗透到生活的方方面面 1 微信小程序可以将基于微信平台
  • 华为OD统一考试 Python【数字转化】

    描述 我们想要一种特殊的整数编码方式 让数字小的时候 编码占的空间也小 编码的方法如下 我们每7位组成一部分来编码 在每个字节里 用前7位来存数字 如果后面还有数据 最高的那一位就是1 否则就是0 数据要按小端序保存 也就是说 小的数据部分
  • 【无迹卡尔曼滤波】不确定和间接测量的非线性动力系统识别研究(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码及文章
  • 2024诸多大厂春招提前启动!Android的程序员还在等什么

    春招 提前批 已开 xdm别打瞌睡了 格力 顺丰 酷狗 沃尔玛中国 理想 科大讯飞等开启春招 开始收简历了 还有hc的企业提前抢人 春招时间短 节奏快 招满即止 就算挂了也绝不能不投 对企业来说 秋招和春招都是储备人才的黄金时期 春招中 除
  • Android Navigation的四大要点你都知道吗?

    在JetPack中有一个组件是Navigation 顾名思义它是一个页面导航组件 相对于其他的第三方导航 不同的是它是专门为Fragment的页面管理所设计的 它对于单个Activity的App来说非常有用 因为以一个Activity为架构
  • 史上最全Java面试八股文(带全部答案)2024年最新版

    今天要谈的主题是关于求职 求职是在每个技术人员的生涯中都要经历多次 对于我们大部分人而言 在进入自己心仪的公司之前少不了准备工作 有一份全面细致 面试题 将帮助我们减少许多麻烦 在跳槽季来临之前 特地做这个系列的文章 一方面帮助自己巩固下基
  • JCMsuite应用:光学环形谐振腔模拟

    本案程演示了环形谐振腔的模拟 这种类型的集成光子器件 例如用作升 降滤波器或在传感应用中 当物质或粒子附着在环上时 通过测量其共振频率的位移来检测 对于集成光子电路中的无源光器件 s矩阵通常是研究的热点 它描述了通过端口 波导进入设备的电磁
  • 【自适应滤波】一种接近最佳的自适应滤波器,用于突发系统变化研究(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码及文章
  • 【go语言】读取toml文件

    一 简介 TOML 全称为Tom s Obvious Minimal Language 是一种易读的配置文件格式 旨在成为一个极简的数据序列化语言 TOML的设计原则之一是保持简洁性 易读性 同时提供足够的灵活性以满足各种应用场景 TOML
  • 【路径规划】基于改进遗传算法求解机器人栅格地图路径规划(Matlab实现实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码实现
  • 基于节点电价的电网对电动汽车接纳能力评估模型研究(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码 数据
  • sychnorized积累

    sychnorized 1 对象锁 包括方法锁 默认锁对象为this 当前实例对象 和同步代码块锁 自己指定锁对象 2 类锁 指synchronize修饰静态的方法或指定锁对象为Class对象 3 加锁和释放锁的原理 现象 时机 内置锁th
  • 软件测试/测试开发|给你剖析闭包与装饰器的魔力

    测试管理班是专门面向测试与质量管理人员的一门课程 通过提升从业人员的团队管理 项目管理 绩效管理 沟通管理等方面的能力 使测试管理人员可以更好的带领团队 项目以及公司获得更快的成长 提供 1v1 私教指导 BAT 级别的测试管理大咖量身打造
  • 计算机Java项目|java游戏账号交易系统

    作者简介 Java领域优质创作者 CSDN博客专家 CSDN内容合伙人 掘金特邀作者 阿里云博客专家 51CTO特邀作者 多年架构师设计经验 腾讯课堂常驻讲师 主要内容 Java项目 Python项目 前端项目 人工智能与大数据 简历模板

随机推荐

  • oracle 数据库通过job定时删除表分区-ok

    通过job实现定时去调用一个删除分区的存储过程 完成分区删除 以下步骤是删除分区的过程 希望能够帮到大家 测试环境 11 2 0 4 需求 每天1点删除 test part 表前3天前的分区 创建测试环境 test part 表 并插入数据
  • Elasticsearch集群搭建教程及生产环境配置

    Elasticsearch 是一个极其强大的搜索和分析引擎 其强大的部分在于能够对其进行扩展以获得更好的性能和稳定性 本教程将提供有关如何设置 Elasticsearch 集群的一些信息 并将添加一些操作技巧和最佳实践来帮助您入门 但应该强
  • 使用ERDAS对国产卫星影像进行控制点正射校正—以高分二号卫星(GF2)为例

    使用ERDAS对国产卫星影像进行控制点正射校正 以高分二号卫星 GF2 为例 一 研究区影像 1 1 高分二号原始影像 影像为山西介休市的一景获取时间为2019 01 22的GF2影像 1 2 参考影像 参考影像为往期的该区域的DOM成果
  • 国庆版头像来了!总有一款适合你!

    国庆日快到啦 在这个举国同庆的日子里 好多小伙伴说想换个国庆专属头像 向来贴心的小新怎能不帮忙 小新在此奉上无水印高清国庆头像 不论男女老少 必有一款适合你 爷爷奶奶版 爸爸妈妈版 文艺青年版 我也是个宝宝版 无差别版 小新先用一步了 你呢
  • Mysql——Redo log 和 Bin log

    Mysql Redo log 和 Bin log 内容出自丁奇45讲 Redo log Redo log是物理日志是InnoDB引擎特有的 记录某个数据页做了什么修改 redo log是循环写的 空间固定会用完 MySQL中 如果每一次的更
  • 2.Linux系统常用工具(vim gcc gdb make)

    一 文本编辑器 vim 1 基本模式 1 命令行模式 控制光标移动 按键操作 按 i 进入插入模式 2 插入模式 只有在此模式下 才可以输入文字 esc 进入命令行模式 3 底行模式 将文件保存或退出vim 也可以设置编辑环境 进入底行模式
  • lattice学习笔记(一)

    格的历史 公钥密码学的安全性都建立在数学问题的困难性上 但量子计算的不断发展 意味着从理论上 基于大整数分解的RSA方案 基于离散对数问题的Diffie Hellman等方案都不再安全 而格密码学将成为候选抗量子计算攻击的密码学方案 因此
  • ddpm代码注释

    import math import torch from torch import nn einsum import torch nn functional as F from inspect import isfunction from
  • python爬取豆瓣电影并保存到数据库

    1 分析url 获取热门电影的url 豆瓣采用的市ajax动态加载技术 我们可以直接找到json数据的url url https movie douban com j search subjectstype movie tag E7 83
  • 安卓逆向基础实战----1.修改APK图标名称

    文章目录 环境 1 替换图标 2 修改应用名称 环境 1 win10 2 雷电模拟器7 1 2 3 AndroidKiller 注意 Apktool 2 4 1 4 APK土豆视频 v6 29 4 1 替换图标 1 首先去网上准备一张png
  • 运营商大数据精准营销获客?

    多年来 大数据运营商一直致力于为企业提供互联网大数据精准营销的新项目 并以确保自身信息安全为前提 例如 如果移动用户查看了任何网站 在网页上搜索了任何关键词 登录了应用程序 给任何人打了电话 以及隶属地区 性別 所有这些都由运营商存储 那么
  • ros2与ros1通信

    ros2和ros1的通信 ros1 bridge安装 ros2与ros1通信过程 终端1 终端2 终端3 终端4 ros1 bridge安装 ros2要实现与ros的通信 需要安装ros1 bridge sudo apt update 注意
  • 【刷题篇】动态规划(二)

    文章目录 分割回文字符串 编辑距离 不同的子序列 动态规划解题思路 分割回文字符串 class Solution public bool isPal string s int begin int end while begin
  • 关于安装rosdep所遇到的问题

    初始化rosdep 开始使用ROS之前 先初始化rosdep rosdep能够轻松地安装要编译的源代码的系统依赖关系 rosdep是ROS核心组件运行的基础 sudo rosdep init 但这一步经常出错 如果出现错误 ERROR ca
  • python循环提取txt文档词频

    一 循环分词并输出为csv文档 import os import numpy as np import pandas as pd import jieba import jieba analyse import matplotlib pyp
  • javascript解决鼠标单击双击冲突方法

    在双击事件 dblclick 过程中 触发的两次单击事件 click 中 第一次的单击事件 click 会被屏蔽掉 但第二次不会 也就是说双击事件 dblclick 会返回一次单击事件 click 结果和一次双击事件 dblclick 结果
  • STM32H7B0 同时启用D-Cache与ADC dma

    使用STM32H7B0刷4 3寸屏幕 不开启D Cache的话 是会卡顿的 同时项目需要使用ADC dma采样 然而开启D Cache之后 dma外设改变内部RAM后 并没有更改Cache内的数据吗 导致CPU无法正确得到RAM内的最新采样
  • c语言之结构体

    代码1 include
  • c++ opp虚函数和抽象基类

    class Base public Base default Base int x num x Base default virtual int getNum return num private int num class Derive
  • C语言的枚举类型(Enum)

    参考 C语言的枚举类型 Enum 地址 https blog csdn net aliyonghang article details 123615803 spm 1001 2014 3001 5502 在实际编程中 有些数据的取值往往是有