当前位置:网站首页>自定义类型——枚举、联合
自定义类型——枚举、联合
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个字节。
边栏推荐
- Comprehensive experiment BGP
- How does UXDB return the number of records for all tables in the current database?
- ogg同步oracle到mysql,字段里面可能有需要转义的字符,怎么配置转义?
- The use of scrapy crawler framework
- GBase 8s 锁分类
- SAP ABAP ALV+SMARTFORS 表分页 报表打印程序
- experiment....
- 优炫数据库支持Oracle哪几种时间及日期类型
- Microsoft Azure & NVIDIA IoT developers season I | Azure IoT & NVIDIA Jetson development foundation
- 扁平数组转树结构实现方式
猜你喜欢

走进音视频的世界——mp3封装格式

HoloView 在 jyputer lab/notebook 不显示总结

Node's traditional and advanced practices for formatting time (moment)

WLAN networking experiment of AC and thin AP

rpm和yum

Shell: Conditional test action

Leetcode - 6135: the longest part of the figure

js中如何实现深拷贝?

Microsoft Azure & NVIDIA IoT developers season I | Azure IoT & NVIDIA Jetson development foundation

STM32个人笔记-看门狗
随机推荐
Classify GBase 8 s lock
opencv创建窗口—cv.namedWindow()
USB Protocol (2) Terminology
rpm和yum
HoloView--live data
解析MySQL数据库:“SQL优化”与“索引优化”
Explain / Desc 执行计划分析
走进音视频的世界——mp3封装格式
Shell: Conditional test action
安装GBase 8c数据库的时候,报错显示“Resource,如何解决?
【Unity3D】相机
将aof文件转换为命令waoffle安装和使用
笔记。。。。
AC与瘦AP的WLAN组网实验
[Dataset] Dataset summary of various insulators, bird's nests and anti-vibration hammers
Get the Token from the revised version of Qubutu Bed
GBase 8c中怎么查询数据库配置参数,例如datestyle
ACmix 论文精读,并解析其模型结构
朴素贝叶斯--学习笔记--基本原理及代码实现
SAP ABAP ALV+SMARTFORS 表分页 报表打印程序