当前位置:网站首页>自定义类型——枚举、联合
自定义类型——枚举、联合
2022-08-01 09:29:00 【王红花x】
目录
一、枚举
1、定义
枚举,就是将所有的可能性一一列举出来。
比如一周有7天,我们可以自定义一个枚举类型 Day,将星期一至星期日列举到类型中。


2、特性及优点
①枚举类型中的值都是常量




②增加代码可读性
下面是一个简单的通讯录的代码,程序需要根据用户的选择来执行不同的功能。
#include <stdio.h>
void menu()
{
printf("-----------------------------");
printf("-----1.add 2.delet -----");
printf("-----3.search 4.modify-----");
printf("-----5.show 6.empty -----");
printf("-----7.sort 0.exit -----");
printf("-----------------------------");
}
int main()
{
int input = 0;
do
{
menu();
printf("请选择:>");
switch (input)
{
case 1:
Add();
break;
case 2:
Delet();
break;
case 3:
Search();
break;
case 4:
Modify();
break;
case 5:
Show();
break;
case 6:
Empty();
break;
case 7:
Sort();
break;
case 0:
printf("程序退出!\n");
break;
default:
printf("输入错误!\n");
break;
}
} while (input);
return 0;
}可以发现在switch,case语句中代码有点抽象,比如当我们写到case 7: 的时候,我们可能已经忘记了7代表什么,需要往上翻一下,而这个代码,可以优化。
#include <stdio.h>
void menu()
{
printf("-----------------------------");
printf("-----1.add 2.delet -----");
printf("-----3.search 4.modify-----");
printf("-----5.show 6.empty -----");
printf("-----7.sort 0.exit -----");
printf("-----------------------------");
}
enum MENU
{
EXIT,
ADD,
DELET,
SEARCH,
MODIFY,
SHOW,
EMPTY,
SORT
};
int main()
{
int input = 0;
do
{
menu();
printf("请选择:>");
switch (input)
{
case ADD:
Add();
break;
case DELET:
Delet();
break;
case SEARCH:
Search();
break;
case MODIFY:
Modify();
break;
case SHOW:
Show();
break;
case EMPTY:
Empty();
break;
case SORT:
Sort();
break;
case EXIT:
printf("程序退出!\n");
break;
default:
printf("输入错误!\n");
break;
}
} while (input);
return 0;
}这样在case时,就很清晰的知道接下来要做什么事。
③增加类型检查,更加严谨
这个特性主要体现在C++中,如下:

在C++语言中,枚举类型只能赋自己定义的值,而不能赋其他类型的值,更严谨 。
二、联合(共用体)
1、定义
联合类型定义的变量与结构体一样,可以有多种不同的类型,区别在于,联合类型的成员变量共用同一块空间,所以联合又称共用体。下面是一个联合体的例子:

2、特性及优点
①共用同一块空间

可以看到,它们的地址都是一样的,同样,如果改变其中一个变量的值,另一个变量也可能会改变。


所以联合类型变量在使用时,一般是只使用其中某一个值,或者在某些特殊情况下使用。
②联合类型大小
文章已经提到过,联合类型的成员变量是共用同一块空间的,那么是不是联合类型的大小就是最大成员的大小呢?请看下面一段代码:
#include <stdio.h>
typedef union Un
{
char arr[5];
int i;
}Un;
int main()
{
printf("%d", sizeof(Un));
return 0;
}是不是char arr[5]占5个字节,int i 占4个字节,取大的话就是5呢?

但运行结果却是 8,这是因为,联合与结构体一样,都存在内存对齐,char arr[5] 的对齐数是1,int i 的对齐数是4,所以Un占用空间的大小必须是4的倍数,也就是8个字节。
边栏推荐
- Lsky Pro 企业版手动升级、优化教程
- 将aof文件转换为命令waoffle安装和使用
- How to get page data
- HoloView 在 jyputer lab/notebook 不显示总结
- Manual upgrade and optimization tutorial of Lsky Pro Enterprise Edition
- Idea common plugins
- STM32个人笔记-嵌入式C语言优化
- Redis中间件(从搭建到弃坑)
- ASP.NET Core 6 Framework Revealing Instance Demonstration [30]: Develop REST API with Routing
- 消息队列面试题(2022最新整理)
猜你喜欢
随机推荐
微服务:事务管理
Opencv creates a window - cv.namedWindow()
Shell: Conditional test action
《时代》杂志:元宇宙时代将改变世界
JVM 运行时数据区与JMM 内存模型详解
Redis middleware (from building to refuse pit)
How to ensure the consistency of database and cache data?
2022.7.31-----leetcode.1161
【应用推荐】常见资源管理器整理,含个人使用体验和产品选型推荐
[Beyond programming] When the fig leaf is lifted, when people begin to accept everything
SkiaSharp 之 WPF 自绘 五环弹动球(案例版)
Shell:条件测试操作
SkiaSharp's WPF self-painted five-ring bouncing ball (case version)
In the background of the GBase 8c database, what command is used to perform the master-slave switchover operation for the gtm and dn nodes
Lsky Pro 企业版手动升级、优化教程
Naive Bayes--Study Notes--Basic Principles and Code Implementation
MySQL query advanced - from the use of functions to table joins, do you remember?
笔记。。。。
179. 最大数
The use of scrapy crawler framework









