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

高阶C语言|枚举与联合

💬 欢迎讨论:在阅读过程中有任何疑问,欢迎在评论区留言,我们一起交流学习!
👍 点赞、收藏与分享:如果你觉得这篇文章对你有帮助,记得点赞、收藏,并分享给更多对C语言感兴趣的朋友!

文章目录

      • 枚举(Enum)
        • 枚举类型的定义
      • 枚举的优点
        • 枚举的使用
      • 联合(共用体,Union)
        • 联合的定义
        • 联合类型的声明
        • 联合变量的定义
        • 联合的特点
        • 联合的使用示例
      • 枚举与联合的对比
      • 总结

枚举(Enum)

枚举,顾名思义,就是将可能的取值一一列举。

在现实生活中,很多事物的取值范围是有限的,可以使用枚举来定义,例如:

  • 一周的七天(星期一到星期日)。
  • 性别(男、女、保密)。
  • 月份(12个月)。
枚举类型的定义
enum Day // 星期
{Mon,Tues,Wed,Thur,Fri,Sat,Sun
};enum Sex // 性别
{MALE,FEMALE,SECRET
};enum Color // 颜色
{RED,GREEN,BLUE
};

在以上定义的 enum Dayenum Sexenum Color 中,{} 内的内容是枚举类型的可能取值,也叫枚举常量

枚举常量默认从 0 开始,依次递增 1,但也可以自定义初始值,如下:

enum Color // 颜色
{RED = 1,GREEN = 2,BLUE = 4
};

枚举的优点

我们可以使用 #define 定义常量,为什么非要使用枚举?

枚举的优点包括:

  1. 增加代码的可读性和可维护性
  2. 相较于 #define,枚举具有类型检查功能,更加严谨
  3. 防止命名污染(封装)
  4. 便于调试
  5. 使用方便,一次可以定义多个常量
枚举的使用
enum Color // 颜色
{RED = 1,GREEN = 2,BLUE = 4
};enum Color clr = GREEN; // 只能用枚举常量赋值,保证类型安全

注意: 避免直接使用枚举常量的整数值赋值给枚举变量,否则可能出现类型不匹配问题。


联合(共用体,Union)

联合的定义

联合类型的变量也包含一系列的成员,不同之处在于所有成员共用同一块存储空间,因此联合也被称为共用体

联合类型的声明
union Un
{char c;int i;
};
联合变量的定义
union Un un;
联合的特点
  1. 共用同一块内存
    • 联合中的所有成员共享同一块存储空间,大小由最长的成员决定。
  2. 节省内存
    • 由于所有成员共用同一块空间,联合适用于节省存储的场景。
  3. 只能存储一个成员的值
    • 由于所有成员共用一块内存,在某一时刻只能存储一个成员的值,存储新值会覆盖之前的值。
联合的使用示例
#include <stdio.h>union Data
{int i;float f;char str[20];
};int main()
{union Data data;data.i = 10;printf("data.i: %d\n", data.i);data.f = 220.5;printf("data.f: %f\n", data.f);strcpy(data.str, "Hello");printf("data.str: %s\n", data.str);return 0;
}

在上述代码中,data 变量存储 intfloatchar 三种类型的数据,但由于它们共用同一块内存,每次存储新的值会覆盖先前存储的值

枚举与联合的对比

特性枚举(enum)联合(union)
目的定义一组有限的离散值节省存储空间,多个变量共用一块内存
存储每个枚举值独占存储空间所有成员共享存储空间
用途适用于表示固定的类别、状态等适用于需要在不同时间存储不同类型数据的场景

总结

  • 枚举(enum) 适用于定义有限的取值范围,提高可读性和安全性。
  • 联合(union) 适用于节省内存,但需要注意同时访问多个成员可能导致数据混乱。

合理选择枚举和联合,可以使代码更加高效、清晰和易维护。

http://www.lryc.cn/news/534972.html

相关文章:

  • 【天梯赛】L1-104 九宫格(C++)
  • 现代C++多线程基础 -忆苦思甜pthread_mutex
  • soular基础教程-使用指南
  • 网络安全网格架构(CSMA) 网络安全框架csf
  • 基于DeepSeek API和VSCode的自动化网页生成流程
  • 【AI时代】Page Assist - 本地 AI 模型的 Web UI (谷歌浏览器) 本地DeepSeek启用联网功能
  • 电脑IP地址自定义
  • python卷积神经网络人脸识别示例实现详解
  • EX_25/2/11
  • 二.2 整数表示(2.1-2.4)
  • 中间件-安装Minio-集成使用(ubantu-docker)
  • 夸克网盘多链接批量保存,自动同步更新,批量分享
  • 2025清华:DeepSeek从入门到精通.pdf(附下载)
  • 【AIGC】在VSCode中集成 DeepSeek(OPEN AI同理)
  • android动态设置是否允许应用卸载
  • 基于微信小程序的博物馆预约系统的设计与实现
  • 使用NPOI自定义导出excel文件
  • 基于vue2 的 vueDraggable 示例,包括组件区、组件放置区、组件参数设置区 在同一个文件中实现
  • 使用rknn进行facenet部署
  • #渗透测试#批量漏洞挖掘#29网课交单平台 SQL注入
  • 百问网imx6ullpro调试记录(linux+qt)
  • 【python】3_容器
  • 数据结构与算法:动态规划dp:背包问题:理论基础(状态压缩/滚动数组)和相关力扣题(416. 分割等和子集、1049.最后一块石头的重量Ⅱ、494.目标和)
  • 数字游牧时代:IT人力外包的范式革命与文明重构
  • Qt - 地图相关 —— 3、Qt调用高德在线地图功能示例(附源码)
  • cloudberry测试
  • RocketMQ、RabbitMQ、Kafka 的底层实现、功能异同、应用场景及技术选型分析
  • UWB功耗大数据插桩调研
  • 郭羽冲IOI2024参赛总结
  • 03:Spring之Web