目录
一、枚举
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个字节。