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

重回C语言之老兵重装上阵(六)枚举

1. 什么是枚举 (enum)?

枚举(enum)是 C 语言中的一种数据类型,用于定义一组具名的整数常量。它可以使代码更加可读,帮助程序员更容易理解程序中的常量值。通过枚举,程序员可以使用有意义的名称来代替数字,增加程序的可维护性。

2. 枚举的定义和语法

2.1 定义枚举

使用 enum 关键字定义一个枚举类型,语法格式如下:

enum 枚举名 {枚举常量1,枚举常量2,枚举常量3,...
};

2.2 枚举的举例

#include <stdio.h>// 定义一个枚举类型 Days
enum Days {Sunday,    // 默认为 0Monday,    // 默认为 1Tuesday,   // 默认为 2Wednesday, // 默认为 3Thursday,  // 默认为 4Friday,    // 默认为 5Saturday   // 默认为 6
};int main() {enum Days today;today = Wednesday;  // 将 Wednesday 赋值给 today// 打印出枚举常量对应的整数值printf("Value of today: %d\n", today);return 0;
}

输出:

Value of today: 3

在上面的代码中,枚举类型 Days 定义了 7 个星期天至星期六的常量,它们的默认值依次为 0, 1, 2, ..., 6

3. 自定义枚举常量的值

可以为枚举常量指定自定义的整数值。如果没有显式指定值,则从第一个枚举常量开始,默认值为 0,每个常量的值依次递增。

3.1 自定义值的语法

enum 枚举名 {枚举常量1 = 自定义值,枚举常量2,枚举常量3 = 自定义值,...
};

3.2 示例:自定义枚举常量的值

#include <stdio.h>enum Days {Sunday = 1,    // 自定义值Monday,        // 默认为 2Tuesday = 5,   // 自定义值Wednesday,     // 默认为 6Thursday,      // 默认为 7Friday,        // 默认为 8Saturday       // 默认为 9
};int main() {enum Days today;today = Tuesday;  // 将 Tuesday 赋值给 todayprintf("Value of today: %d\n", today);  // 输出 Tuesday 对应的整数值return 0;
}

输出:

Value of today: 5

在上面的代码中,Sunday 被赋值为 1,Tuesday 被赋值为 5,其余枚举常量按顺序自增。

4. 枚举类型的使用

4.1 枚举作为变量类型

枚举类型可以作为变量的类型,定义变量时使用枚举类型名。枚举变量可以存储枚举常量的值。

enum Day {Sunday,Monday,Tuesday
};enum Day today;  // 定义一个枚举变量 today
today = Monday;  // 给 today 赋值为 Monday

4.2 枚举值与整数的关系

枚举常量实际上是整数类型,所以它们可以与其他整数值进行比较,甚至用于算术运算。

enum Week {Sun = 1,Mon,Tue,Wed,Thu,Fri,Sat
};int main() {enum Week today = Mon;if (today == 2) {  // 由于 Mon 的值是 2printf("Today is Monday.\n");}return 0;
}

4.3 枚举类型的转换

尽管枚举类型是整型,但它们通常不会被隐式地转换为其他数据类型。可以通过显式转换将枚举值转换为整数:

enum Day {Sunday = 0,Monday,Tuesday
};int main() {enum Day today = Monday;int dayValue = (int) today;  // 将枚举值转换为整数printf("Day value: %d\n", dayValue);return 0;
}

输出:

Day value: 1

5. 枚举的应用场景

  • 提高代码可读性:通过使用有意义的枚举名称,替代整数常量,使代码更加清晰。
  • 状态标识:用于表示不同的状态,例如网络请求的状态、任务的进度等。
  • 位域标志:用于位操作,可以使用枚举来表示不同的位标志。

5.1 例子:使用枚举表示状态

#include <stdio.h>enum Status {SUCCESS = 0,FAILURE = 1,PENDING = 2
};int main() {enum Status currentStatus = FAILURE;if (currentStatus == FAILURE) {printf("The operation failed.\n");}return 0;
}

5.2 例子:位标志和枚举

#include <stdio.h>enum Permission {READ = 1,    // 0001WRITE = 2,   // 0010EXECUTE = 4  // 0100
};int main() {int userPermission = READ | WRITE;  // 用户有读写权限if (userPermission & READ) {printf("User has read permission.\n");}if (userPermission & WRITE) {printf("User has write permission.\n");}if (userPermission & EXECUTE) {printf("User has execute permission.\n");}return 0;
}

6. 枚举的优缺点

6.1 优点

  • 增强可读性:枚举能够用具名的常量替代数字,提高代码的可理解性。
  • 减少错误:枚举确保了常量值是有限且预定义的,减少了使用无效值的可能性。
  • 便于维护:可以集中管理和修改枚举常量,提高程序的可维护性。

6.2 缺点

  • 类型不安全:枚举类型本质上是整数,因此容易出现类型不一致的错误。虽然 C 语言没有内置的枚举类型安全机制,但可以通过类型检查来避免此问题。
  • 存储空间:枚举常量的存储方式和 int 类型相同,可能会占用较多的内存。

相关文章:

重回C语言之老兵重装上阵(六)枚举

1. 什么是枚举 (enum)&#xff1f; 枚举&#xff08;enum&#xff09;是 C 语言中的一种数据类型&#xff0c;用于定义一组具名的整数常量。它可以使代码更加可读&#xff0c;帮助程序员更容易理解程序中的常量值。通过枚举&#xff0c;程序员可以使用有意义的名称来代替数字&…...

STL-list类

list的介绍和使用 list的介绍 list的介绍list的介绍 list是双向循环链表 list的使用 构造 list(size_t n,const value_type& val value_type())构造的list中包含n个值为val的元素list()构造空listlis(const list& x)拷贝构造函数list(inputlerator first,inputlter…...

Hanlp的学习

参考&#xff1a;HanLP 自然语言处理使用总结-CSDN博客 参考&#xff1a;Sprint Boot 工程中HanLP配置相对路径&#xff0c;始终有问题的解决方案_springboot hanlp-CSDN博客 <!--hanlp 依赖--><dependency><groupId>com.hankcs</groupId><artifa…...

Excel中函数SIGN()的用法

Excel中函数SIGN的用法 1. 函数详细讲解1.1 函数解释1.2 使用格式1.3 参数定义1.4 要点 2. 实用演示示例2.1 函数需求2.2 公式编写 3. 注意事项4. 文档下载5. 其他文章6. 获取全部Excel练习素材快来试试吧&#x1f970; 函数练习素材&#x1f448;点击即可进行下载操作操作注意…...

如何将本地电脑上的文件夹设置为和服务器的共享文件夹

将本地电脑上的文件夹设为与服务器共享的文件夹&#xff0c;通常是在本地开启文件共享&#xff0c;并配置相应的权限&#xff0c;使服务器可以访问该文件夹。以下以 Windows 系统为例说明具体操作步骤&#xff1a; 一、在本地电脑上设置共享文件夹 选择文件夹 找到需要共享的文…...

智能建筑时代的核心选择——基于SAIL-RK3576核心板的AI边缘计算网关方案

随着智能建筑技术的不断发展&#xff0c;建筑设备正日益向“智慧化”迈进。传统的建筑管理系统往往依赖中央服务器和云端平台进行数据处理和控制&#xff0c;但在实时监控、安防及能耗管理等关键环节&#xff0c;延迟和数据安全问题依然存在。此外&#xff0c;物联网设备数量激…...

08、如何预防SQL注入

目录 1、分析及其存在哪些危险 2、预防SQL注入 1、分析及其存在哪些危险 原理: SQL 注入是一种常见的网络攻击手段,攻击者通过在用户输入中插入恶意的 SQL 语句,利用程序对用户输入处理不当的漏洞,使恶意 SQL 语句被数据库服务器执行。 通常发生在应用程序将用户输入直接拼…...

【时时三省】(C语言基础)柔性数组

山不在高&#xff0c;有仙则名。水不在深&#xff0c;有龙则灵。 ----CSDN 时时三省 柔性数组 C99中&#xff0c;结构中的最后一个元素允许是未知大小的数组&#xff0c;这就叫做 柔性数组 成员。 例如&#xff1a; 这里把arr就称为柔性数组 有的编译器上是写成int arr&…...

mongodb详解二:基础操作

基础操作 数据库操作collection操作查看表插入数据查找数据 数据库操作 1.创建数据库 use test_db;如果没有数据库&#xff0c;use命令会新建一个&#xff1b;有的话&#xff0c;会切换到这个数据库 2.查看数据库 show dbs;collection操作 查看表 show tables;插入数据 …...

【数据分享】1929-2024年全球站点的逐月平均气温数据(Shp\Excel\免费获取)

气象数据是在各项研究中都经常使用的数据&#xff0c;气象指标包括气温、风速、降水、湿度等指标&#xff0c;其中又以气温指标最为常用&#xff01;说到气温数据&#xff0c;最详细的气温数据是具体到气象监测站点的气温数据&#xff01;本次我们为大家带来的就是具体到气象监…...

管理口令安全和资源(一)

学习目标 Manage passwords using profiles: 使用配置文件&#xff08;profiles&#xff09;来管理密码。这意味着你应该能够设置和修改密码策略&#xff0c;比如密码的复杂性、有效期、尝试次数限制等。在Oracle数据库中&#xff0c;配置文件是一组可以应用于所有用户的预定义…...

【Linux】【Vim】vim编辑器的用法

一、vim简介 Vim是一款功能强大且高度可定制的文本编辑器&#xff0c;广泛应用于Linux 和 Unix系统中。 它不仅继承了vi编辑器的所有特性&#xff0c;还增加了许多新的功能&#xff0c;如语法高亮、代码折叠、多级撤销等。 Vim有三种主要的工作模式&#xff1a; 命令模式&am…...

Golang Gin系列-3:Gin Framework的项目结构

在Gin教程的第3篇&#xff0c;我们将讨论如何设置你的项目。这不仅仅是把文件扔得到处都是&#xff0c;而是要对所有东西的位置做出明智的选择。相信我&#xff0c;这些东西很重要。如果你做得对&#xff0c;你的项目会更容易处理。当你以后不再为了找东西或添加新功能而绞尽脑…...

LabVIEW实车四轮轮速信号再现系统

开发了一个基于LabVIEW的实车四轮轮速信号再现系统。该系统解决现有电机驱动传感器成本高、重复性差、真实性差和精度低等问题&#xff0c;提供一种高精度、低成本的轮速信号再现解决方案。 项目背景 ABS轮速传感器在现代汽车安全系统中发挥着至关重要的作用。为保证其准确性和…...

2025.1.16——六、BabySQL 双写绕过|联合注入

题目来源&#xff1a;buuctf [极客大挑战 2019]BabySQL 1 目录 一、打开靶机&#xff0c;分析已知信息 二、手工注入解题 step 1&#xff1a;万能密码 step 2&#xff1a;正常注入&#xff0c;判断字段数 step 3&#xff1a;绕过 step 4&#xff1a;查数据库 step 5&am…...

Spring Boot 下的Swagger 3.0 与 Swagger 2.0 的详细对比

先说结论&#xff1a; Swgger 3.0 与Swagger 2.0 区别很大&#xff0c;Swagger3.0用了最新的注释实现更强大的功能&#xff0c;同时使得代码更优雅。 就个人而言&#xff0c;如果新项目推荐使用Swgger 3.0&#xff0c;对于工具而言新的一定比旧的好&#xff1b;对接于旧项目原…...

【已解决】git clone报错:Failed to connect to github.com port 443: Timed out

1.问题原因1 报错信息1&#xff1a; fatal: unable to access https://github.com/microsoft/xxx/: Failed to connect to github.com port 443: Timed out 报错信息2&#xff1a; fatal: unable to access https://github.com/xxx/xx/: OpenSSL SSL_read: Connection was …...

Qt 程序 DPI 适配方法归纳

方案1&#xff1a;通过 Windows api 处理 缺点&#xff1a;放大之后界面会模糊。 通过调用api实现 #include <ShellScalingAPI.h> #pragma comment(lib, "Shcore.lib")HRESULT hr SetProcessDpiAwareness(PROCESS_SYSTEM_DPI_AWARE);或者使用qt.conf 实现 在…...

AI刷题-小R的随机播放顺序、不同整数的计数问题

目录 一、小R的随机播放顺序 问题描述 测试样例 解题思路&#xff1a; 问题理解 数据结构选择 算法步骤 最终代码&#xff1a; 运行结果&#xff1a; 二、 不同整数的计数问题 问题描述 测试样例 解题思路&#xff1a; 问题理解 数据结构选择 算法步骤 最终…...

windows 极速安装 Linux (Ubuntu)-- 无需虚拟机

1. 安装 WSL 和 Ubuntu 打开命令行&#xff0c;执行 WSL --install -d ubuntu若报错&#xff0c;则先执行 WSL --update2. 重启电脑 因安装了子系统&#xff0c;需重启电脑才生效 3. 配置 Ubuntu 的账号密码 打开 Ubuntu 的命令行 按提示&#xff0c;输入账号&#xff0c;密…...

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…...

进程地址空间(比特课总结)

一、进程地址空间 1. 环境变量 1 &#xff09;⽤户级环境变量与系统级环境变量 全局属性&#xff1a;环境变量具有全局属性&#xff0c;会被⼦进程继承。例如当bash启动⼦进程时&#xff0c;环 境变量会⾃动传递给⼦进程。 本地变量限制&#xff1a;本地变量只在当前进程(ba…...

基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销&#xff0c;平衡网络负载&#xff0c;延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...

React Native 导航系统实战(React Navigation)

导航系统实战&#xff08;React Navigation&#xff09; React Navigation 是 React Native 应用中最常用的导航库之一&#xff0c;它提供了多种导航模式&#xff0c;如堆栈导航&#xff08;Stack Navigator&#xff09;、标签导航&#xff08;Tab Navigator&#xff09;和抽屉…...

阿里云ACP云计算备考笔记 (5)——弹性伸缩

目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...

DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI

前一阵子在百度 AI 开发者大会上&#xff0c;看到基于小智 AI DIY 玩具的演示&#xff0c;感觉有点意思&#xff0c;想着自己也来试试。 如果只是想烧录现成的固件&#xff0c;乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外&#xff0c;还提供了基于网页版的 ESP LA…...

【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)

升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点&#xff0c;但无自动故障转移能力&#xff0c;Master宕机后需人工切换&#xff0c;期间消息可能无法读取。Slave仅存储数据&#xff0c;无法主动升级为Master响应请求&#xff…...

深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南

&#x1f680; C extern 关键字深度解析&#xff1a;跨文件编程的终极指南 &#x1f4c5; 更新时间&#xff1a;2025年6月5日 &#x1f3f7;️ 标签&#xff1a;C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言&#x1f525;一、extern 是什么&#xff1f;&…...

全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比

目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec&#xff1f; IPsec VPN 5.1 IPsec传输模式&#xff08;Transport Mode&#xff09; 5.2 IPsec隧道模式&#xff08;Tunne…...

Java + Spring Boot + Mybatis 实现批量插入

在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法&#xff1a;使用 MyBatis 的 <foreach> 标签和批处理模式&#xff08;ExecutorType.BATCH&#xff09;。 方法一&#xff1a;使用 XML 的 <foreach> 标签&#xff…...