当前位置:网站首页>自定义类型——枚举、联合
自定义类型——枚举、联合
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个字节。
边栏推荐
- sqlserver怎么查询一张表中同人员的交叉日期
- Idea 常用插件
- leetcode-6134:找到离给定两个节点最近的节点
- Microsoft Azure & NVIDIA IoT 开发者季 I|Azure IoT & NVIDIA Jetson 开发基础
- Install GBase 8 c database, the error shows "Resource, how to solve?
- PerViT: 神经网络也能像人类利用外围视觉一样观察图像!
- Pod environment variables and initContainer
- opencv创建窗口—cv.namedWindow()
- ASP.NET Core 6框架揭秘实例演示[30]:利用路由开发REST API
- 淘宝商品详情又见淘宝详情,升级高级版 API
猜你喜欢
随机推荐
opencv创建窗口—cv.namedWindow()
JVM 运行时数据区与JMM 内存模型详解
WLAN networking experiment of AC and thin AP
【Untitled】
mysql在cmd的登录及数据库与表的基本操作
Custom IP used in PCIE
Ogg synchronizes oracle to mysql, there may be characters that need to be escaped in the field, how to configure escape?
Manual upgrade and optimization tutorial of Lsky Pro Enterprise Edition
《时代》杂志:元宇宙时代将改变世界
net stop/start mysql80 access denied
BGP综合实验
TiDB的真实数据库数据是存在kv和还是pd上?
Delphi MDI appliction documents maximize display, remove buttons such as maximize and minimize
常见的API安全缺陷有哪些?
PerViT: 神经网络也能像人类利用外围视觉一样观察图像!
HoloView--live data
在GBase 8c数据库后台,使用什么样的命令来对gtm、dn节点进行主备切换的操作
USB Protocol (2) Terminology
Redis middleware (from building to refuse pit)
navicat mysql 内存占用过高,被强制关闭









