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

高阶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.kler.cn/a/541056.html

相关文章:

  • MYSQL学习笔记(七):新年第一篇之子查询
  • MHTML文件如何在前端页面展示
  • 【数据结构】双向链表(真正的零基础)
  • 模拟算法:深入探讨与C++实现
  • 前端页面添加水印
  • 基于html写一个音乐动态爱心盒子有音乐和导航基本功能实现
  • 详解Redis中lua脚本和事务
  • 网络安全组织架构表 网络安全技术架构
  • vue3+websocket+springboot、websocket消息通讯
  • 2025.2.8——二、Confusion1 SSTI模板注入|Jinja2模板
  • DWORD 和 QWORD
  • yum报错 Could not resolve host: mirrorlist.centos.org
  • HarmonyOS开发 - 记事本实例一(界面搭建)
  • 如何利用 AWS 预测分析功能做精准财务规划?
  • C++ STL Map 学习学案(提高版)
  • java-LinkedList源码详解
  • 本地部署DeepSeek-R1(Mac版)
  • keil5自学笔记1(基础设置)
  • RapidrepairDaoImpl
  • 利用ES6 Set去重
  • 标题:深入探索 gRPC:后端开发中高效通信的利器
  • Python语言的数据可视化
  • 2025年一段代码使用python完成过年放烟花写祝福
  • 【多模态大模型】系列2:如何用多GPU训练一个非常大的模型(数据/模型/流水线/张量并行、MoE、混合精度训练、压缩、激活重新计算)
  • elementplus 使用日期时间选择器,设置可选范围为前后大于2年且只能选择历史时间不能大于当前时间点
  • DeepSeek大模型的发展的十问十答