news 2026/4/22 22:46:12

5. enum(枚举)关键字在C/C++中的作用

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
5. enum(枚举)关键字在C/C++中的作用

enum(枚举)关键字本质是用来定义一组有名字的整数常量,替代直接使用魔法数字(比如 0、1、2),让代码更易读、易维护。

1. 什么是enum?(核心概念)

enum(枚举类型)是C/C++的用户自定义类型,核心目的是:把一组逻辑相关的常量(比如星期、颜色、状态码)赋予有意义的名字,避免代码中出现无意义的数字(比如用 0 表示周一、1 表示周二)。

枚举的本质是整数:默认情况下,第一个枚举常量值为 0,后续依次 +1;也可以手动指定常量的值。

2. C语言中enum的基础用法

(1)基本定义与使用(默认值)
#include<stdio.h>// 定义枚举类型:表示一周的七天enumWeek{Mon,// 默认值 0Tue,// 默认值 1Wed,// 默认值 2Thu,// 默认值 3Fri,// 默认值 4Sat,// 默认值 5Sun// 默认值 6};intmain(){// 定义枚举变量:C语言中需加 enum 关键字(和结构体类似)enumWeektoday=Wed;// 枚举变量本质是整数,可直接打印(输出 2)printf("今天是周%d\n",today);// 用枚举常量替代数字,代码更易读if(today==Wed){printf("今天是周三\n");}return0;}
(2)手动指定枚举常量的值

可以给枚举常量手动赋值,未指定的常量会基于前一个值 +1:

#include<stdio.h>// 手动指定值:周一=1,后续依次+1;周日手动指定=7enumWeek{Mon=1,Tue,// 2Wed,// 3Thu,// 4Fri,// 5Sat,// 6Sun=7};// 另一个例子:状态码(手动跳值)enumStatus{SUCCESS=0,// 成功ERROR=-1,// 通用错误FILE_NOT_FOUND=100,// 文件不存在PERMISSION_DENIED=101// 权限不足};intmain(){enumWeektoday=Mon;printf("今天是周%d\n",today);// 输出 1enumStatuscode=FILE_NOT_FOUND;printf("错误码:%d\n",code);// 输出 100return0;}
(3)C中省略enum定义变量(typedef简化)

和结构体类似,C中定义枚举变量默认需要加enum,可以用typedef简化:

#include<stdio.h>// 用typedef重命名,让Week成为独立类型名typedefenum{Mon=1,Tue,Wed}Week;intmain(){// 无需加 enum,直接定义变量(和C++效果一致)Week today=Tue;printf("今天是周%d\n",today);// 输出 2return0;}

3. C++中enum的扩展(更灵活)

C++兼容C的枚举用法,还做了两个关键扩展:

(1)默认可省略enum定义变量
#include<iostream>usingnamespacestd;enumWeek{Mon=1,Tue,Wed};intmain(){// C++中可直接写 Week,无需加 enumWeek today=Wed;cout<<"今天是周"<<today<<endl;// 输出 3return0;}
(2)强类型枚举(enum class,C++11+)

普通枚举的缺点:常量作用域全局(容易命名冲突)、可隐式转换为整数;enum class解决了这些问题,是C++推荐的写法:

#include<iostream>usingnamespacestd;// 强类型枚举:作用域限定在 Color 内,不可隐式转整数enumclassColor{Red=1,Green=2,Blue=3};intmain(){// 必须写 Color::Red,不能直接写 Red(作用域限定)Color c=Color::Green;// 错误:强类型枚举不能直接打印(避免隐式转换)// cout << c << endl;// 正确:显式转换为整数后打印cout<<(int)c<<endl;// 输出 2// 错误:不能隐式比较枚举和整数// if (c == 2) {}// 正确:和枚举常量比较if(c==Color::Green){cout<<"颜色是绿色"<<endl;}return0;}

4. 枚举的核心使用场景

  • 替代魔法数字:比如状态码(成功/失败)、选项(开/关)、有限取值集合(星期、月份、颜色);
  • 提升代码可读性:if (status == SUCCESS)if (status == 0)更易理解;
  • 限制取值范围:让变量只能取预定义的常量值,避免无效值(比如星期只能是 Mon~Sun)。

总结

  1. 核心作用enum用来定义一组命名的整数常量,替代魔法数字,提升代码可读性;
  2. C vs C++:C定义枚举变量需加enum(可通过typedef简化),C++可省略;C++11+的enum class是强类型枚举,更安全;
  3. 本质:枚举常量是整数,普通枚举可隐式转整数,enum class禁止隐式转换,更符合类型安全。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/19 16:39:58

python 学习笔记(文件和目录操作)

创建目录 os.makedirs可以递归的创建目录结构。 import os os.makedirs(tmp/python/test,exist_okTrue) #exit_ok True指定了&#xff0c;如果某个要创建的目录已经存在&#xff0c;也不报错删除文件或目录 os.remove 可以删除一个文件 os.remove(test.py)**shutil.rmtree()**…

作者头像 李华
网站建设 2026/4/22 4:39:20

实验一 安全威胁与攻击实验

一、实验目的安全威胁与攻击实验与理论教学第一章信息安全概论相对应。本实验在学生完成MAC地址欺骗攻击与防御实验、OSPF路由项欺骗攻击和防御实验的基础上&#xff0c;使学生能够理解威胁、攻击、资产的关系&#xff0c;并理解基本安全设计原则的重要性。具体如下&#xff1a…

作者头像 李华
网站建设 2026/4/21 1:18:17

二十一、pinctrl子系统

前言 前面我们写的GPIO驱动程序都是自己在驱动里面定义好gpio引脚需要用到的寄存器&#xff0c;然后在驱动程序里面直接去配置这些寄存器。Linux是一个成熟的&#xff0c;跨平台的通用操作系统&#xff0c;对于配置引脚这样的最基本的功能&#xff0c;是已经有一套现成的框架可…

作者头像 李华
网站建设 2026/4/17 0:11:24

Java Web 社区医院信息平台系统源码-SpringBoot2+Vue3+MyBatis-Plus+MySQL8.0【含文档】

摘要 随着信息技术的快速发展&#xff0c;传统社区医院的管理模式已难以满足现代医疗服务的需求。社区医院在日常运营中涉及患者信息管理、医生排班、药品库存、预约挂号等多方面业务&#xff0c;传统的手工记录或单机系统存在效率低下、数据易丢失、信息共享困难等问题。为了提…

作者头像 李华
网站建设 2026/4/21 15:05:37

基于SpringBoot+Vue的IT交流和分享平台管理系统设计与实现【Java+MySQL+MyBatis完整源码】

摘要 随着互联网技术的快速发展&#xff0c;IT技术交流与知识分享的需求日益增长。传统的技术论坛和社交媒体平台虽然提供了基础的交流功能&#xff0c;但在专业性、系统性和用户体验方面仍有较大提升空间。尤其是在技术问答、资源共享和项目管理等方面&#xff0c;缺乏高效的整…

作者头像 李华
网站建设 2026/4/17 4:50:01

Java SpringBoot+Vue3+MyBatis 师生健康信息管理系统系统源码|前后端分离+MySQL数据库

摘要 随着信息化技术的快速发展&#xff0c;校园健康管理逐渐成为教育领域的重要课题。传统的师生健康信息管理多依赖纸质记录或分散的电子表格&#xff0c;存在数据易丢失、更新不及时、统计效率低下等问题。尤其是在新冠疫情期间&#xff0c;健康信息的实时监控和高效管理显得…

作者头像 李华