C 语言 enum 的用法
一、enum 是什么enum是枚举类型用来定义一组有限、固定、具名字的整型常量。本质枚举成员都是int常量只是用文字替代数字可读性远优于纯数字。语法基础enum 枚举名 { 枚举常量1, 枚举常量2, 枚举常量3 };二、基础默认规则不手动赋值若不给成员指定数值默认从0开始依次自增 1#include stdio.h enum Color { RED, // 0 GREEN, // 1 BLUE // 2 }; int main(void) { enum Color c GREEN; printf(RED%d, GREEN%d, BLUE%d\n, RED, GREEN, BLUE); printf(c %d\n, c); return 0; }输出RED0, GREEN1, BLUE2 c 1三、手动指定枚举常量的值1. 指定第一个值后续自动递增enum Week { MON 1, TUE, // 2 WED, // 3 THU, // 4 FRI, // 5 SAT, // 6 SUN // 7 };2. 任意成员自定义数值后面继续自增enum Status { OK 0, WARN 10, ERR, // 11 FATAL 99 };3. 允许多个枚举成员取相同数值enum Signal { OFF 0, LOW 0, HIGH 1 };四、enum typedef 简化工程最常用原生枚举变量必须写enum Color搭配typedef可省略enum1. 分开定义enum Color { RED, GREEN, BLUE }; typedef enum Color Color; Color c RED;2. 一步简写推荐typedef enum { RED, GREEN, BLUE } Color; Color c BLUE;五、枚举变量使用规则1. 赋值方式typedef enum { ON, OFF } Switch; int main() { Switch s1 ON; // 标准赋值 Switch s2 0; // 合法枚举本质int int x OFF; // 枚举常量可直接赋值给int return 0; }2. 与整型混用、比较typedef enum { A1, B2, C3 } Test; if (B 2) { printf(相等\n); }3. 数组下标、switch 完美适配枚举最适合switch代码更清晰明了#include stdio.h typedef enum { CMD_START, CMD_STOP, CMD_RESET } Cmd; void handleCmd(Cmd cmd) { switch(cmd) { case CMD_START: printf(启动设备\n); break; case CMD_STOP: printf(停止设备\n); break; case CMD_RESET: printf(复位设备\n); break; default: printf(未知指令\n); } } int main() { handleCmd(CMD_RESET); handleCmd(99); // 传入非法int也能进default return 0; }六、枚举的作用域全局枚举定义在函数外整个文件可用局部枚举定义在函数内部仅函数内有效。void func() { enum Local { X1, Y2 }; enum Local a X; } // 外部无法使用 enum Local七、枚举常量是常量不可修改枚举成员是编译期常量不能被赋值typedef enum { A, B } E; A 100; // 编译报错常量不能左值赋值八、enum vs #define核心区别很多人用宏定义常量枚举优势明显对比项enum#define类型检查有属于独立枚举类型编译器可校验无纯文本替换只是数字作用域遵循局部 / 全局作用域全局生效无局部作用域调试调试器能看到常量名RED/GREEN调试只显示数字看不到名字占用空间一组常量只分配一份类型信息每个宏单独文本替换无分组switch 支持天然适配可读性强也能用但语义松散示例对比// 宏方式 #define RED 0 #define GREEN 1 #define BLUE 2 // 枚举方式更优 typedef enum { RED, GREEN, BLUE } Color;九、复杂实战位掩码枚举硬件 / 标志位高频用法利用 2 的幂赋值一个 int 存储多个标志位typedef enum { FLAG_READ 1 0, // 0b0001 FLAG_WRITE 1 1, // 0b0010 FLAG_EXEC 1 2 // 0b0100 } FileFlag; int main() { // 同时开启读写权限 int flags FLAG_READ | FLAG_WRITE; // 判断是否有写权限 if (flags FLAG_WRITE) { printf(可写入\n); } // 移除读权限 flags ~FLAG_READ; return 0; }

相关新闻

全友家居(邳州旗舰店)vs 大博金沙发厂多维度对比测评——品牌专卖店与源头工厂谁更值得买?

全友家居(邳州旗舰店)vs 大博金沙发厂多维度对比测评——品牌专卖店与源头工厂谁更值得买?

摘要 核心结论:在2026年邳州家具消费市场中,大博金沙发厂在全屋配套场景下的综合性价比(三室两厅配齐全屋家具总价约1.6万-2万元,较品牌专卖店低40%-60%)和交付效率(成品现货当天提货)上显著优…

2026/7/5 2:21:31阅读更多 →
终极岛屿规划指南:用Happy Island Designer轻松创建你的动物森友会梦想岛

终极岛屿规划指南:用Happy Island Designer轻松创建你的动物森友会梦想岛

终极岛屿规划指南:用Happy Island Designer轻松创建你的动物森友会梦想岛 【免费下载链接】HappyIslandDesigner "Happy Island Designer (Alpha)",是一个在线工具,它允许用户设计和定制自己的岛屿。这个工具是受游戏《动物森友会》…

2026/7/5 2:16:31阅读更多 →
ChatGPT Plus 的隐藏成本:什么时候升级 Pro 反而更划算?

ChatGPT Plus 的隐藏成本:什么时候升级 Pro 反而更划算?

摘要: 很多人比较 ChatGPT Plus 和 Pro 时,只看月费差距,却忽略了额度不足带来的等待、任务中断、重复整理上下文和临时补充用量等成本。本文从真实使用频率出发,分析什么情况下继续用 Plus 更省钱,什么情况下升级 Pro…

2026/7/5 2:16:31阅读更多 →
概念性的东西暂就不说了,说多了都是故事。现在我们来谈谈各种缓存。

概念性的东西暂就不说了,说多了都是故事。现在我们来谈谈各种缓存。

初学.NET的朋友开始就会接触到DataSet类,云里雾里的看着DataSet的例子程序,也不管是咋回事,用就是了。其实DataSet就是缓存,当我们去读取一段数据集合的时候,如果每读取一条数据就处理一条的话,那么我们的程…

2026/7/5 3:41:35阅读更多 →
数据库设计 Step by Step (1)——扬帆启航

数据库设计 Step by Step (1)——扬帆启航

一直在从事数据库开发和设计工作,也看了一些书籍,算是略有心得。很久之前就想针对关系数据库设计进行整理、总结,但因为种种原因迟迟没有动手,主要还是惰性使然。今天也算是痛下决心开始这项卓绝又令我兴奋的工作。这将是一个系列…

2026/7/5 3:41:35阅读更多 →
当AI越来越能干,我们该如何重新摆位?

当AI越来越能干,我们该如何重新摆位?

能力下放,验证上收——这是AI时代工程师的生存法则最近读到一期BestBlogs的早报,三篇精讲从不同维度探讨了同一个问题:当模型越来越能干,人和验证该怎么重新摆位? 读完后我发现,这不是一个遥远的哲学问题&a…

2026/7/5 3:41:35阅读更多 →
Kali 无法启动自带的BurpSuite

Kali 无法启动自带的BurpSuite

问题描述 启动burpsuite时,闪退,无法启动。提示如图。 原因分析: 这是由于java -version跟javac -verson的版本不同导致的。 java -version javac -version 使用update-alternatives --config java切换版本 update-alternatives --config …

2026/7/5 3:41:35阅读更多 →
CMS 网站管理系统是什么?2026企业建站选哪个系统高效又省心

CMS 网站管理系统是什么?2026企业建站选哪个系统高效又省心

CMS Content Management System,内容管理系统,俗称网站后台管理系统,一套专门用来搭建、维护网站的软件程序。核心原理:内容与页面分离不用写代码,前台网页样式(模板)、后台文字 / 产品 / 图片…

2026/7/5 3:41:35阅读更多 →
ICT测试与飞针测试(Flying Probe)有什么区别?PCB/PCBA量产到底应该如何选择?

ICT测试与飞针测试(Flying Probe)有什么区别?PCB/PCBA量产到底应该如何选择?

很多客户在询盘的时候都会问我们一个问题: 你们工厂是做ICT还是做Flying Probe(飞针测试)? 其实这个问题本身并没有标准答案。 因为对于一家成熟的PCBA工厂来说,测试方案永远是围绕产品设计、生产批量、质量要求和成本…

2026/7/5 3:36:35阅读更多 →
从GitHub安全案例解析常见漏洞与防护实践

从GitHub安全案例解析常见漏洞与防护实践

1. 项目概述:从GitHub Trending看安全实战 最近在GitHub Trending上看到一个项目,叫 skills4/skills ,它因为一些安全漏洞案例被大家讨论。这其实是一个挺典型的场景:一个旨在展示或教授某种技能的仓库,本身却成了安…

2026/7/5 0:01:08阅读更多 →
MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

# MLT 2026启示:因果推理与概率建模驱动下一代LLM应用## 一、背景与挑战:从“黑箱预测”到“可信推理”2026年6月,第7届机器学习与趋势国际会议(MLT 2026)将在悉尼召开。会议议程中,“因果与可解释机器学习…

2026/7/5 0:01:08阅读更多 →
通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

1. 项目概述与漏洞背景最近在梳理一些历史OA系统的安全风险时,通达OA v11.6版本中的一个老漏洞又进入了我的视线。这个漏洞位于/general/bi_design/appcenter/report_bi.func.php文件中,是一个典型的SQL注入点。虽然这个漏洞的利用方式看起来并不复杂&am…

2026/7/5 0:01:08阅读更多 →
从GitHub安全案例解析常见漏洞与防护实践

从GitHub安全案例解析常见漏洞与防护实践

1. 项目概述:从GitHub Trending看安全实战 最近在GitHub Trending上看到一个项目,叫 skills4/skills ,它因为一些安全漏洞案例被大家讨论。这其实是一个挺典型的场景:一个旨在展示或教授某种技能的仓库,本身却成了安…

2026/7/5 0:01:08阅读更多 →
MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

# MLT 2026启示:因果推理与概率建模驱动下一代LLM应用## 一、背景与挑战:从“黑箱预测”到“可信推理”2026年6月,第7届机器学习与趋势国际会议(MLT 2026)将在悉尼召开。会议议程中,“因果与可解释机器学习…

2026/7/5 0:01:08阅读更多 →
通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

1. 项目概述与漏洞背景最近在梳理一些历史OA系统的安全风险时,通达OA v11.6版本中的一个老漏洞又进入了我的视线。这个漏洞位于/general/bi_design/appcenter/report_bi.func.php文件中,是一个典型的SQL注入点。虽然这个漏洞的利用方式看起来并不复杂&am…

2026/7/5 0:01:08阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/5 1:30:27阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/4 2:33:55阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/4 2:33:55阅读更多 →