当前位置:网站首页>自定义类型——枚举、联合
自定义类型——枚举、联合
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个字节。
边栏推荐
- 用OpenCV的边缘检测
- navicat mysql 内存占用过高,被强制关闭
- Static Pod, Pod Creation Process, Container Resource Limits
- UXDB如何返回当前数据库所有表的记录数?
- Leetcode - 6135: the longest part of the figure
- SkiaSharp's WPF self-painted five-ring bouncing ball (case version)
- 热修复技术可谓是百花齐放
- Idea common plugins
- HoloView -- Tabular Datasets
- ASP.NET Core 6框架揭秘实例演示[30]:利用路由开发REST API
猜你喜欢
随机推荐
Manual upgrade and optimization tutorial of Lsky Pro Enterprise Edition
USB Protocol (2) Terminology
sqlserver怎么查询一张表中同人员的交叉日期
杰理AD14N/AD15N---串口中断问题
Microsoft Azure & NVIDIA IoT developers season I | Azure IoT & NVIDIA Jetson development foundation
experiment....
《时代》杂志:元宇宙时代将改变世界
Meeting OA (Upcoming Meetings & All Meetings)
50.【动态二维数组的运用】
会议OA(待开会议&所有会议)
常见的API安全缺陷有哪些?
network basic learning
HoloView——实时数据
codeforces每日5题(均1600)-第二十七天
力扣周赛304 6135. 图中的最长环 内向基环树
ASP.NET Core 6 Framework Revealing Instance Demonstration [30]: Develop REST API with Routing
2022.7.31-----leetcode.1161
热修复技术可谓是百花齐放
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
Prime Ring Problem(素数环问题)