当前位置:网站首页>自定义类型——枚举、联合
自定义类型——枚举、联合
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个字节。
边栏推荐
- Custom IP used in PCIE
- pytest interface automation testing framework | pass in parameter values in the form of function return values
- ASP.NET Core 6框架揭秘实例演示[30]:利用路由开发REST API
- 企业微信群:机器人定时提醒功能数据库配置化
- various network protocols
- Go-Excelize API源码阅读(八)——GroupSheets(sheets []string)、UngroupSheets()
- 在GBase 8c数据库后台,使用什么样的命令来对gtm、dn节点进行主备切换的操作
- 网络基础学习
- C语言小游戏——扫雷
- rpm and yum
猜你喜欢

scrapy爬虫框架的使用

HoloView -- Tabular Datasets

AC与瘦AP的WLAN组网实验
改版去不图床 Token 的获取

Explain / Desc execution plan analysis

net stop/start mysql80 拒绝访问

leetcode-6133:分组的最大数量

18张图,直观理解神经网络、流形和拓扑
![[Beyond programming] When the fig leaf is lifted, when people begin to accept everything](/img/e1/ff8d416c99e1f370d73b9520654ddf.jpg)
[Beyond programming] When the fig leaf is lifted, when people begin to accept everything

net stop/start mysql80 access denied
随机推荐
Go-Excelize API源码阅读(八)——GroupSheets(sheets []string)、UngroupSheets()
network basic learning
notes....
Redis middleware (from building to refuse pit)
Redis 3.2.3 crashed by signal: 11 服务宕机问题排查
朴素贝叶斯--学习笔记--基本原理及代码实现
HoloView--Customization
rpm和yum
Quantify daily work metrics
Redis学习
获取页面数据的方法
Custom IP used in PCIE
leetcode-6134: Find the closest node to the given two nodes
Shell: Conditional test action
C语言中编译时出现警告C4013(C语言不加函数原型产生的潜在错误)
Detailed explanation of JVM runtime data area and JMM memory model
[Beyond programming] When the fig leaf is lifted, when people begin to accept everything
【STM32】入门(一):环境搭建、编译、下载、运行
灵魂发问:MySQL是如何解决幻读的?
codeforces每日5题(均1600)-第二十七天