c 语言 enum 用法 定义与实战详解
c 语言 enum 就是枚举类型,核心作用是把一组固定的整型常量统一命名,让代码可读性变强,不用硬写数字,程序里面状态码类别选项这类有限取值场景优先使用 enum,enum 本质底层仍然是整数,默认第一个枚举成员从 0 开始,后面成员依次自动加 1,也可以手动指定成员数值,还能定义 enum 类型变量用来存储这些枚举值,很多初学者容易混淆,以为 enum 是独立新数据类型,其实它是用户自定义的整型常量集合,相比 define 宏定义,enum 是有类型属性的,编译器可以做类型检查,调试的时候还能直接看到枚举名字,比纯宏更适合有限选项业务。之所以推荐使用 enum,是因为项目里面大量写数字比如 1 代表运行 2 代表暂停 3 代表停止,后期维护很难看懂含义,使用 enum 之后代码语义清晰,修改数值的时候只需要在枚举定义位置调整,不用全文搜索替换数字,减少出错概率。实际使用第一步先声明枚举类型,写关键字 enum 加上枚举标签,大括号里面写入枚举成员,第二步按需手动赋值或者使用默认递增,第三步定义该 enum 类型变量,第四步在判断分支里面使用枚举成员做比较,第五步编译调试,注意枚举可以隐式转成整数,但是整数赋值给 enum 变量的时候部分编译器会给出警告,最后根据业务规范决定是否加强类型校验。
一 enum 基础语法规则
基础声明格式
enum 枚举标签 {成员 1 成员 2 成员 3};
默认赋值规则
如果没有手动写数值,成员 1 等于 0,成员 2 等于 1,成员 3 等于 2,依次累加
手动赋值写法
enum 状态 { RUN = 1, PAUSE = 2, STOP = 3 };
也支持部分手动赋值,后面成员继续在上一个数值基础上加 1
示例 enum 等级 { A = 10, B, C }; 这里 B 等于 11,C 等于 12
定义变量三种写法
第一种 声明类型同时定义变量
enum 状态 { RUN, PAUSE, STOP } s1;
第二种 先声明类型,后面单独定义变量
enum 状态 s2;
第三种 使用 typedef 给 enum 起别名,日常项目最常用
typedef enum { RUN, PAUSE, STOP } State;
State s3;
二 enum 核心特性
1 底层是整型,枚举成员是整型常量,不能在代码运行阶段修改枚举成员本身的值
2 枚举成员作用域是全局,定义之后成员名字直接可以使用,不需要加枚举标签
3 允许重复数值,也就是不同枚举成员可以设置成同一个整数,编译器不会报错,业务设计要谨慎避免歧义
4 枚举变量可以参与算术运算,但是不推荐,因为会破坏枚举原本有限取值的设计意图
5 枚举和 switch 搭配是经典组合,switch case 分支直接写枚举成员,代码非常清爽
三 完整代码示例
include
typedef enum {
RUN = 1,
PAUSE,
STOP
} State;
int main()
{
State cur = RUN;
switch(cur)
{
case RUN:
printf("当前是运行状态\n");
break;
case PAUSE:
printf("当前是暂停状态\n");
break;
case STOP:
printf("当前是停止状态\n");
break;
}
return 0;
}
四 enum 和 define 宏对比表
| 对比项目 | c 语言 enum | define 宏 |
|---|---|---|
| 类型属性 | 属于自定义类型,编译器类型检查 | 纯文本替换,没有类型 |
| 调试支持 | 调试器可以识别枚举名称 | 预处理替换,调试看不到宏名 |
| 自动递增 | 支持自动累加赋值 | 不支持,每个数值手动写 |
| 作用域 | 可以局部作用域 | 全局预处理,容易命名冲突 |
| 内存 | 只占用编译期常量,不分配运行内存 | 预处理替换,不占用内存 |
五 使用注意事项
1 不要把任意整数直接强制赋值给 enum 变量,虽然语法允许,但是会出现不在枚举定义范围内的值,业务逻辑容易出错
2 枚举成员名字不要和其他变量函数重名,因为枚举成员属于常量,重名会编译报错
3 C89 标准里面 enum 成员类型是 int,C 语言标准没有强制规定枚举底层必须是 int,部分编译器可以指定底层存储类型,但是标准 c 语言不支持自定义底层类型
4 枚举不能直接输入输出成名字,printf 只能打印对应的整数,如果想要打印枚举文字名称,需要额外写映射表或者函数转换
【常见问题】
问题 1 c 语言 enum 用法里面枚举成员默认数值是从 1 开始吗
回答 1 c 语言 enum 用法默认规则不是从 1 开始,默认第一个枚举成员数值是 0,后续成员自动加 1,如果需要从 1 开始,必须手动给第一个成员赋值,这是学习 c 语言 enum 用法最常见误区
问题 2 c 语言 enum 用法可以修改枚举成员的值吗
回答 2 c 语言 enum 用法里面枚举成员本质是整型常量,程序运行阶段不能修改枚举成员本身数值,只能修改 enum 类型变量保存的值,这点是 c 语言 enum 用法核心要点
问题 3 c 语言 enum 用法适合用来替代所有 define 宏吗
回答 3 c 语言 enum 用法适合有限整型常量集合,不适合替代全部 define 宏,define 宏还可以定义字符串表达式浮点常量,enum 只支持整型常量,选择的时候根据场景判断,不要盲目全部替换成 c 语言 enum 用法
【免责申明】
本内容 c 语言 enum 用法讲解仅用于编程学习参考,不同编译器对 enum 底层实现和类型警告策略存在差异,正式项目开发请遵循 ANSI C 标准以及项目编码规范,因照搬示例代码产生编译警告逻辑错误,使用者自行承担相关责任。
相关阅读
-
普通常规体检报告一般当天或者次日就能拿到,复杂套餐、需要病理化验、专项检查的体检,出报告时间在 3 到 ...浏览全文>>
-
DAC 全称数模转换器,作用是把数字信号转换成模拟信号,简单理解就是电脑播放器声卡这类设备输出的数字音频,...浏览全文>>
-
想要山药蒸得好吃又简单,核心就是优先选粉糯的铁棍山药,保留外皮清洗干净,水开上汽之后再上锅蒸,根据粗细...浏览全文>>
-
核心结论就是 C 语言自学核心原则是理论加敲代码同步进行,不能只看书不写代码,学习顺序按照基础语法,核心...浏览全文>>
-
c 语言输出菱形是循环嵌套章节经典上机题,核心是利用双重 for 循环,分上半部分和下半部分打印空格与星号...浏览全文>>
-
平板搭配蓝牙键盘使用主要就是先给键盘开机进入配对模式,再在平板蓝牙列表找到设备连接,连接成功之后就可以...浏览全文>>
-
c 语言 enum 就是枚举类型,核心作用是把一组固定的整型常量统一命名,让代码可读性变强,不用硬写数字,程...浏览全文>>
-
蓝牙音响怎么连接手机,核心就是把音响开机并切换到蓝牙配对模式,再打开手机蓝牙搜索设备完成配对,配对成功...浏览全文>>
-
C 罗当前俱乐部属于沙特职业联赛的利雅得胜利球队,同时在国家队层面属于葡萄牙国家男子足球队并且担任队长,...浏览全文>>
-
首先要重点说明:一周瘦 10 斤属于极速减重,健康风险很高,并不推荐所有人尝试。健康减重的通用标准是每周...浏览全文>>
- c 罗属于哪个球队 现役归属详细说明
- 宠物牙剪用在什么地方 美容修剪实操详解
- csgo 怎么说话 打字 对局语音文字沟通指南
- csgo 十大令人忍俊的名字 趣味游戏 ID 合集
- cryonmyshoulder 原唱是谁 歌曲原版歌手解析
- cpu 二手的能用吗 二手处理器选购风险说明
- 杭州市医院排名前十 三甲综合医院介绍
- conj 代表什么词性 连词缩写详解
- cloth 复数形式 一词两义单复数考点
- 病假工资如何计算 核算规则与实操要点
- cheers 是怎么来的 词源演变与用法深度解析
- CF 体验服怎么申请资格在那个网站 申请教程
- cf 榴弹怎么加子弹 榴弹弹药扩容方式详解
- cf 大跳 按键操作详细教学
- can 和 can 同形异义词辨析
- cad 圆角命令怎么用 F 圆角操作详解
- cad 动作宏怎么取消 动作录制器停止与删除
- c9 联盟高校的简介 九校办学概况深度解读
- c25 代表什么含义 常见场景释义说明
- burger 单词释义详解
