自定义类型之枚举类型(enum)和联合体类型(union)

 

目录

 

枚举类型(enum)

什么是枚举类型?

枚举类型的使用

枚举类型的优势

枚举类型的应用场景

总结

联合体类型(union)

什么是联合体?

联合体的应用场景

联合体的注意事项

总结


枚举类型(enum)

枚举类型是C语言中一种非常有用的数据类型,它允许程序员定义一组命名的常量。枚举类型为代码增加了可读性和可维护性,使得程序更易于理解和调试。本文将介绍枚举类型的基本概念、用法和一些实际应用场景。

什么是枚举类型?

枚举类型是一种用户定义的数据类型,它允许程序员定义一组具有命名值的常量。枚举类型通过列出所有可能的取值来定义一组相关的常量。在C语言中,枚举类型使用 enum 关键字来定义。

枚举类型的使用

定义了枚举类型后,我们可以使用枚举类型来声明变量,并将枚举常量赋值给这些变量。

例如:

#include <stdio.h>// 定义枚举类型
enum Weekday {Monday=1,//枚举类的成员如果没有赋值默认从0开始Tuesday,//每个成员递增1Wednesday,Thursday,Friday,Saturday,Sunday
};int main() {// 声明枚举类型变量并赋值enum Weekday today1 = Monday;enum Weekday today2 = Tuesday;enum Weekday today3 = Wednesday;enum Weekday today4 = Thursday;enum Weekday today5 = Friday;enum Weekday today6 = Saturday;enum Weekday today7 = Sunday;// 使用枚举类型变量printf("Today is %d\n", today1);// 输出:1printf("Today is %d\n", today2);// 输出:2printf("Today is %d\n", today3);// 输出:3printf("Today is %d\n", today4);// 输出:4printf("Today is %d\n", today5);// 输出:5printf("Today is %d\n", today6);// 输出:6printf("Today is %d\n", today7);// 输出:7//也可以不用创建枚举变量直接使用int a = Monday;printf("Today is %d\n", a);//1return 0;
}

枚举类型的优势

  1. 增加可读性和可维护性: 使用枚举类型可以将常量的含义直观地展现在代码中,使得代码更易读、易懂,就可以用这些名字去象征常量。
  2. 提高程序的健壮性: 枚举类型可以减少在代码中出现的硬编码错误,因为它可以帮助程序员避免直接使用数字或字符串来表示常量。
  3. 与#define定义的常量相比更好调试:#define声明的关键字一般都在预编译阶段,而调试是在之后打包成.exe调试的,所以对于编译器就看不到常量名所象征的意义
  4. 一次可声明多个常量

枚举类型的应用场景

  1. 表示状态或选项: 例如表示星期几、月份、选项等。
  2. 错误码: 例如表示函数返回的错误码。
  3. 状态机: 枚举类型可以方便地表示状态机的状态。

总结

枚举类型是C语言中一种简单但功能强大的数据类型,它为程序员提供了一种有效的方式来组织和管理常量。通过使用枚举类型,程序员可以编写更具表现力和可读性的代码,从而提高代码的质量和可维护性。因此,在编写C语言程序时,枚举类型是一种非常有用的类型,值得程序员们加以充分利用。

联合体类型(union)

联合体(Union)是C语言中一种特殊的数据类型,它允许在同一内存位置存储不同类型的数据。联合体的特点在于所有成员共享同一块内存空间,与位段不同位段中的变量可能共用1个字节,但是其中的值完全独立的,因此联合体的大小取决于其最大成员的大小。    

什么是联合体?

联合体是一种用户定义的数据类型,它允许在同一内存位置存储不同类型的数据。与结构体不同的是,联合体中的每个成员共享同一块内存空间,这意味着在任意时刻只能存储一个成员的值。因此,联合体的大小由其最大成员的大小决定。

#include <stdio.h>// 定义联合体
union MyUnion {int intValue;double doubleValue;char stringValue[20];
};int main() {// 声明联合体变量并赋值union MyUnion myUnion;myUnion.intValue = 10;// 访问联合体的成员并用中文进行打印printf("整型值: %d\n", myUnion.intValue);printf("双精度浮点数值: %f\n", myUnion.doubleValue); // 未定义行为,潜在的问题printf("字符串值: %s\n", myUnion.stringValue); // 未定义行为,潜在的问题return 0;
}

联合体的应用场景

  1. 节省内存空间: 联合体允许在同一内存位置存储不同类型的数据,从而节省内存空间。
  2. 实现联合体类型的变量: 联合体可以用于实现一种变体类型的变量,即在不同时间存储不同类型的数据。
  3. 处理联合体类型的数据: 联合体可以用于处理一些特殊的数据结构,例如网络数据包、硬件寄存器等。

联合体的注意事项

  1. 联合体中的各个成员共享同一块内存空间,因此在任意时刻只能存储一个成员的值。
  2. 访问联合体的成员需要谨慎,因为在某些情况下可能会产生未定义行为。
  3. 联合体的成员可以是任意类型,包括基本数据类型、数组、结构体等。

总结

联合体是C语言中一种灵活而强大的数据类型,它提供了一种有效的方式来在同一内存位置存储不同类型的数据。虽然在使用联合体时需要注意一些潜在的问题,但在某些情况下,联合体可以成为解决特定问题的理想选择。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/681066.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++ //练习 6.5 编写一个函数输出其实参的绝对值。

C Primer&#xff08;第5版&#xff09; 练习 6.5 练习 6.5 编写一个函数输出其实参的绝对值。 环境&#xff1a;Linux Ubuntu&#xff08;云服务器&#xff09; 工具&#xff1a;vim 代码块 /*************************************************************************&…

【Ubuntu】在.bashrc文件中误设置环境变量补救方法

这里是vim也不在PATH中了&#xff0c;因为 解决方法就是在输入vim之后提示的vim路径下用vim打开该文件&#xff0c;然后改回来

(三十六)大数据实战——ClickHouse数据库的部署安装实现

前言 ClickHouse是俄罗斯的Yandex于2016年开源的列式存储数据库 DBMS &#xff09;&#xff0c;使用C语言编写&#xff0c;主要用于在线分析处理查询&#xff08; OLAP &#xff09;&#xff0c;能够使用SQL查询实时生成分析数据报告。列式存储&#xff1a;数据按列进行存储&a…

局部特征描述子

局部特征描述子是用于表示图像、点云或其他数据中局部区域特征的一种方法。它们通常用于计算机视觉、三维重建和模式识别等领域。局部特征描述子的主要目标是捕获图像或数据中的局部结构和特征&#xff0c;这些特征在旋转、尺度和光照变化等方面具有不变性或者部分不变性。 一…

结合Next项目实际认识webpack.splitChunks

本文的目的在于简单的介绍webpack的优化功能配置&#xff1a;splitChunks。 webpack5出于“开箱即用”的目的&#xff0c;将大部分曾经要使用插件的功能集成到了config配置中&#xff0c;因此用户只需要了解如何配置&#xff0c;即可达到优化目的&#xff0c;其中最常使用接触的…

Backtrader 文档学习- Observers - Reference

Backtrader 文档学习- Observers - Reference 1.Benchmark class backtrader.observers.Benchmark() 观察器存储策略的回报和参考资产的回报&#xff0c;参考资产是传递给系统的数据之一。 参数&#xff1a; timeframe (default: None) &#xff0c;如果None&#xff0c;则将…

【ES】--ES集成自定义分词库

目录 一、相关安装1、(window单机)elasticsearch安装2、安装Elasticvue插件3、ik分词器插件4、ES集成自定义词库 一、相关安装 1、(window单机)elasticsearch安装 Win10下下载ES组件&#xff0c;安装部署如下&#xff1a;JDK1.8、elasticsearch-7.3.2-windows-x86_64。 Elast…

Debezium发布历史124

原文地址&#xff1a; https://debezium.io/blog/2022/06/21/debezium-1-9-4-final-released/ 欢迎关注留言&#xff0c;我是收集整理小能手&#xff0c;工具翻译&#xff0c;仅供参考&#xff0c;笔芯笔芯. Debezium 1.9.4.Final Released June 21, 2022 by Chris Cranford …

qt “美颜”

要想成为一名优秀的qt工程师 学会使用qss编程也是重要的 不可获缺的一部分 qss 简介和优势 QSS&#xff08;Qt Style Sheets&#xff09;是一种用于定义Qt应用程序界面外观和样式的样式表语言。它类似于CSS&#xff08;层叠样式表&#xff09;&#xff0c;但针对Qt框架进行了定…

末两位数(1992)_题解

【题解提供者】吴立强 解法 思路 指数函数增长速率过快&#xff0c;直接计算中间过程任何一种基本类型都无法存储。 通过乘法运算的规律&#xff0c;可以发现末两位数只和末两位数相关&#xff0c;故直接对中间结果保留末两位数&#xff08;mod 100&#xff09;即可避免乘法…

每日五道java面试题之java基础篇(七)

第一题. HashMap和HashTable有什么区别&#xff1f;其底层实现是什么&#xff1f; 区别 &#xff1a; HashMap⽅法没有synchronized修饰&#xff0c;线程⾮安全&#xff0c;HashTable线程安全&#xff1b;HashMap允许key和value为null&#xff0c;⽽HashTable不允许 底层实现…

容器高级知识: 适配器模式与 Sidecar 模式的区别

适配器模式与 Sidecar 模式的区别 在 Kubernetes 中&#xff0c;适配器模式和 Sidecar 模式都是扩展您的主应用程序容器功能的方法&#xff0c;但它们具有不同的目的和功能&#xff1a; Sidecar 模式&#xff1a; 通用目的&#xff1a; 为主应用程序提供 补充功能&#xff0…

(十五)springboot实战——spring securtity的核心过滤器介绍

前言 本节内容主要介绍spring securtity安全框架的一些核心过滤器及其作用&#xff0c;我们都清楚spring securtity安全框架底层是基于filter过滤器实现的&#xff0c;采用的是责任链的设计模式&#xff0c;它有一条很长的过滤器链。本次spring securtity原理介绍使用的版本是…

H12-821_31

31.下面是一台路由器的部分配置,关于该配置描述正确的是: A.源地址为1.1.1.1的数据包匹配第一条ACL语句rule 0,匹配规则为允许 B.源地址为1.1.1.3的数据包匹配第三条ACL语句rule 2,匹配规则为拒绝 C.源地址为1.1.1.4的数据包匹配第四条ACL语句rule 3,匹配规则为允许 D.源地址为…

Android13多媒体框架概览

Android13多媒体框架概览 Android 多媒体框架 Android 多媒体框架旨在为 Java 服务提供可靠的接口。它是一个系统&#xff0c;包括多媒体应用程序、框架、OpenCore 引擎、音频/视频/输入的硬件设备&#xff0c;输出设备以及一些核心动态库&#xff0c;比如 libmedia、libmedi…

探索Gorm - Golang流行的数据库ORM框架

&#x1f3f7;️个人主页&#xff1a;鼠鼠我捏&#xff0c;要死了捏的主页 &#x1f3f7;️系列专栏&#xff1a;Golang全栈-专栏 &#x1f3f7;️个人学习笔记&#xff0c;若有缺误&#xff0c;欢迎评论区指正 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&…

14.7 OpenGL图元装配和光栅化:早期各片段测试

早期各片段测试 Early Per-Fragment Tests layout(early_fragment_tests) in; 如果片段着色器指定了 Early_fragment_tests 布局限定符&#xff0c;则将在片段着色器执行之前执行本节中描述的每个片段测试。 否则&#xff0c;它们将在片段着色器执行后执行。在光栅化阶段生成片…

自动化测试工具

自动化测试工具有很多种&#xff0c;比如&#xff1a; Appium 。Appium是一个移动端自动化测试开源工具&#xff0c;支持iOS和Android平台&#xff0c;支持Python、Java等语言&#xff0c;即同一套Java或Python脚本可以同时运行在iOS和Android平台。 Appium是一个开源测试自动…

8个Python编程进阶常用技巧!

前言 介绍 Python 炫酷功能&#xff08;例如&#xff0c;变量解包&#xff0c;偏函数&#xff0c;枚举可迭代对象等&#xff09;的文章层出不穷。但是还有很多 Python 的编程小技巧鲜被提及。因此&#xff0c;本文会试着介绍一些其它文章没有提到的小技巧&#xff0c;这些小技…

多态

多态的基本语法 多态分为两类 静态多态: 函数重载 和 运算符重载属于静态多态&#xff0c;复用函数名动态多态: 派生类和虚函数实现运行时多态 静态多态和动态多态区别&#xff1a; 静态多态的函数地址早绑定 - 编译阶段确定函数地址动态多态的函数地址晚绑定 - 运行阶段确…