当前位置: 首页 > news >正文

「C系列」C enum(枚举)

文章目录

  • 一、C enum(枚举)
  • 二、C enum(枚举)应用场景
  • 三、C enum(枚举)应用案例代码
    • 1. 定义状态枚举
    • 2. 定义选项枚举
    • 3. 定义错误码枚举
    • 4. 定义常量枚举(例如星期几)
  • 四、相关链接

一、C enum(枚举)

在C语言中,enum(枚举)是一种用户定义的类型,它允许程序员为一组命名的整型常量指定别名。枚举类型可以使代码更易于理解和维护,因为它们为整数值提供了有意义的名称。

下面是一个简单的C语言枚举示例:

#include <stdio.h>// 定义一个名为DayOfWeek的枚举类型
enum DayOfWeek {Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday
};int main() {enum DayOfWeek today = Wednesday;printf("Today is %d\n", today); // 注意:这通常不会输出"Wednesday",而是输出整数值// 如果你想要输出对应的名称,你需要自定义一个函数来实现这个功能return 0;
}

在上面的示例中,enum DayOfWeek 定义了一个名为 DayOfWeek 的枚举类型,其中包含了一周的每一天。注意,枚举成员(如 Sunday)是常量,并且默认从0开始分配整数值(除非显式指定)。因此,Sunday 的值为0,Monday 的值为1,依此类推。

但是,如果你想要打印出枚举值的名称(如 “Wednesday”),你需要编写一个自定义函数来根据枚举值查找并返回相应的名称。因为C语言本身并不直接支持从枚举值到名称的映射。

另外,你也可以为枚举成员显式地指定整数值:

enum DayOfWeek {Sunday = 1,Monday = 2,// ... 其他成员可以隐式地分配后续的值
};

在这种情况下,Sunday 的值为1,Monday 的值为2,而 Tuesday 的值将为3(因为没有显式指定)。

二、C enum(枚举)应用场景

C语言中的enum(枚举)具有多种应用场景,以下是一些常见的使用场景,并结合参考文章中的信息进行详细的解释:

  1. 定义状态枚举
  • 当一个变量需要在几个固定的状态之间切换时,可以使用枚举来定义这些状态。例如,文件的状态(打开、关闭、读取、写入等)。
  • 通过为每种状态分配一个唯一的枚举值,可以增加代码的可读性和可维护性。
  1. 定义选项枚举
  • 在用户界面或命令行工具中,经常需要定义一组选项供用户选择。例如,菜单选项(新增、删除、编辑等)。
  • 使用枚举可以确保用户只能选择有效的选项,同时避免由于输入错误导致的不必要错误。
  1. 定义错误码枚举
  • 在程序中处理错误时,通常需要返回一个错误码来表示发生了哪种类型的错误。例如,定义一个枚举类型来表示错误码(成功、失败、超时等)。
  • 使用枚举可以使错误处理更加清晰和一致,同时方便调试和错误排查。
  1. 定义常量枚举
  • 当程序中需要一组常量值来表示某种分类或属性时,可以使用枚举。例如,定义一个枚举类型表示星期几(周一、周二、周三等)。
  • 通过枚举,可以确保这些常量值在整个程序中保持一致,并且具有明确的含义。
  1. 增加代码的可读性和可维护性
  • 使用枚举替代魔法数字(即直接在代码中使用的整数值)可以使代码更加易于理解和维护。
  • 枚举值具有明确的名称和含义,使得代码更易于阅读和理解。
  1. 类型检查
  • 相比于使用#define定义的常量,枚举类型具有类型检查功能,可以在编译时捕获类型不匹配的错误。
  • 这有助于减少由于类型错误导致的运行时错误。
  1. 防止命名污染
  • 通过将枚举值封装在枚举类型中,可以避免与其他标识符(如变量名、函数名等)发生冲突。
  • 这有助于减少命名污染和命名冲突的风险。
  1. 便于调试
  • 当使用枚举时,可以在调试过程中更容易地识别和理解变量的值。
  • 枚举值具有明确的名称和含义,使得在调试时可以更快地定位问题所在。

C语言中的enum(枚举)在多种场景下都发挥着重要作用,包括定义状态、选项、错误码和常量等。使用枚举可以增加代码的可读性和可维护性,同时提供类型检查和防止命名污染的功能。在编写C语言程序时,应充分利用枚举来提高代码的质量和效率。

三、C enum(枚举)应用案例代码

当讨论C语言中的enum(枚举)的应用场景时,以下是一些具体的案例代码,展示了enum在不同场景下的使用:

1. 定义状态枚举

#include <stdio.h>enum LightStatus {OFF,ON,BLINKING
};int main() {enum LightStatus status = ON;if (status == ON) {printf("The light is on.\n");}status = BLINKING;printf("The light is now blinking.\n");return 0;
}

2. 定义选项枚举

#include <stdio.h>enum MenuOption {QUIT,NEW_GAME,LOAD_GAME,HELP
};int main() {enum MenuOption choice;printf("Please select an option:\n");printf("1. Quit\n");printf("2. New Game\n");printf("3. Load Game\n");printf("4. Help\n");scanf("%d", &choice); // 注意:这里使用了int来读取输入,因为枚举值在内存中仍然是整数switch (choice) {case QUIT:printf("Exiting the program.\n");break;case NEW_GAME:printf("Starting a new game.\n");break;// ... 其他选项的处理default:printf("Invalid option.\n");break;}return 0;
}

3. 定义错误码枚举

#include <stdio.h>enum ErrorCode {SUCCESS = 0,FILE_NOT_FOUND,INVALID_ARGUMENTS,OUT_OF_MEMORY,// ... 其他错误码
};enum ErrorCode openFile(const char *filename) {// 假设这里有一些文件打开的逻辑if (/* 文件不存在 */) {return FILE_NOT_FOUND;}if (/* 参数无效 */) {return INVALID_ARGUMENTS;}// ... 其他错误检查return SUCCESS;
}int main() {enum ErrorCode err = openFile("example.txt");if (err != SUCCESS) {switch (err) {case FILE_NOT_FOUND:printf("File not found.\n");break;case INVALID_ARGUMENTS:printf("Invalid arguments.\n");break;// ... 其他错误码的处理default:printf("Unknown error.\n");break;}} else {printf("File opened successfully.\n");}return 0;
}

4. 定义常量枚举(例如星期几)

#include <stdio.h>enum DayOfWeek {SUNDAY,MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY,SATURDAY
};int main() {enum DayOfWeek today = WEDNESDAY;switch (today) {case SUNDAY:printf("Today is Sunday.\n");break;case MONDAY:printf("Today is Monday.\n");break;// ... 其他星期几的处理case WEDNESDAY:printf("Today is Wednesday.\n");break;// ...default:printf("Invalid day of week.\n");break;}return 0;
}

四、相关链接

  1. Visual Studio Code下载地址
  2. Sublime Text下载地址
  3. 「C系列」C 简介
  4. 「C系列」C 基本语法
  5. 「C系列」C 数据类型
  6. 「C系列」C 变量及常见问题梳理
  7. 「C系列」C 常量
  8. 「C系列」C 存储类
  9. 「C系列」C 运算符
  10. 「C系列」C 判断/循环
  11. 「C系列」C 函数
  12. 「C系列」C 作用域规则
  13. 「C系列」C 数组

相关文章:

  • go-zero整合Excelize并实现Excel导入导出
  • pytest+requests+allure自动化测试接入Jenkins学习
  • uniapp地图选择位置
  • docker部署redis实践
  • `kubectl get pod -oyaml` 和 `kubectl describe pod`
  • C#面:什么是 Windows 服务,它的生命周期与标准的 EXE 程序有什么不同
  • 【2024算力大会分会 | SPIE独立出版 | 往届均已完成EI检索】2024云计算、性能计算与深度学习国际学术会议(CCPCDL 2024)
  • Pydantic的BaseConfig
  • 一款优秀的下载和共享工具
  • 数值计算精度问题(浮点型和双整型累加精度测试)
  • 机器学习专题记录
  • 机器学习作业6——svm支持向量机
  • 探索AOSP中的RRO:运行时资源覆盖的奥秘
  • tmux 移植到ARM板端运行环境搭建
  • Leetcode3174. 清除数字
  • SegmentFault for Android 3.0 发布
  • [译]前端离线指南(上)
  • 2019.2.20 c++ 知识梳理
  • Angular 响应式表单之下拉框
  • Angular2开发踩坑系列-生产环境编译
  • Facebook AccountKit 接入的坑点
  • java B2B2C 源码多租户电子商城系统-Kafka基本使用介绍
  • Kibana配置logstash,报表一体化
  • Linux链接文件
  • NLPIR语义挖掘平台推动行业大数据应用服务
  • Node + FFmpeg 实现Canvas动画导出视频
  • PhantomJS 安装
  • socket.io+express实现聊天室的思考(三)
  • 复杂数据处理
  • 机器学习 vs. 深度学习
  • 聊聊redis的数据结构的应用
  • 前端性能优化--懒加载和预加载
  • 前端学习笔记之观察者模式
  • 算法-插入排序
  • 微信小程序开发问题汇总
  •  一套莫尔斯电报听写、翻译系统
  • 怎么把视频里的音乐提取出来
  • elasticsearch-head插件安装
  • ​Base64转换成图片,android studio build乱码,找不到okio.ByteString接腾讯人脸识别
  • $.ajax()方法详解
  • (4)Elastix图像配准:3D图像
  • (javascript)再说document.body.scrollTop的使用问题
  • (LNMP) How To Install Linux, nginx, MySQL, PHP
  • (二)fiber的基本认识
  • (二)PySpark3:SparkSQL编程
  • (二)换源+apt-get基础配置+搜狗拼音
  • (转)用.Net的File控件上传文件的解决方案
  • .bat批处理(二):%0 %1——给批处理脚本传递参数
  • .bat批处理(三):变量声明、设置、拼接、截取
  • .net core 6 redis操作类
  • .NET MAUI学习笔记——2.构建第一个程序_初级篇
  • .NET教程 - 字符串 编码 正则表达式(String Encoding Regular Express)
  • .NET企业级应用架构设计系列之结尾篇
  • .Net语言中的StringBuilder:入门到精通
  • .Net中ListT 泛型转成DataTable、DataSet