该文章的上一篇文章:C/C++自定义类型(1)-CSDN博客
个人主页:仍有未知等待探索_C语言疑难,数据结构,小项目-CSDN博客
专题分栏:C语言疑难_仍有未知等待探索的博客-CSDN博客
目录
一、引言
二、枚举
1、枚举是什么
2、枚举的格式
3、枚举类型的初始化
4、枚举类型中常量的值
5、枚举类型的使用
6、枚举类型的优势
7、define的运算
三、 联合体
1、联合体是什么
2、联合体的格式
3、联合体赋值
4、联合体的大小
一、引言
继上篇文章讲了结构体和位段之后,接着来写枚举类型和联合类型。
二、枚举
1、枚举是什么
枚举,顾名思义,就是将一些东西一一列举出来、把可能的取值一一列举。理解的话没有那么的困难。
比如:
人的性别:男、女;
星期:星期一、星期二、星期三、星期四、星期五、星期六、星期日;
三原色:红、绿、蓝;
…etc
2、枚举的格式
和结构体的大体结构是一样的,不同的就是枚举的关键字是enum。在枚举里面,对于常量的定义的末尾不要用分号,要用逗号相连。
#include//建立一个关于性别的枚举类型//如下结构体的关键字是enum// 标签字是Sex//male,female,secret是常量,每个常量与一个常数相等enum Sex{male,female,secret};int main(){return 0;}
3、枚举类型的初始化
像下面一样,可以对枚举类型中常量给赋值。
#include//建立一个关于性别的枚举类型//如下结构体的关键字是enum// 标签字是Sex//male,female,secret是常量,每个常量与一个常数相等enum Sex{male=1,female=3,secret=7};int main(){return 0;}
4、枚举类型中常量的值
根据上述的描述,一直在说枚举类型中常量等于一个常数。但是,这个常数是电脑随机出来的吗?显然不是,如果是的话,那我们不知道这个数是多少,怎么用呢。请往下看:
1、我们可以对其进行初始化,让其代表的值可以是我们自己认为的值。
#includeenum Sex{male=1,female=3,secret=7};int main(){printf("%d\n", male);printf("%d\n", female);printf("%d\n", secret);return 0;}
2、如果我们不赋初值的话,那他代表的值是多少?
从下面的图片中也可以看出来,如果不对其进行初始化的时候,每个常量代表的值,从0开始往下增1。
#includeenum Sex{male,female,secret};int main(){printf("%d\n", male);printf("%d\n", female);printf("%d\n", secret);return 0;}
3、如果我只对第一个进行初始化的话,会发生什么现象呢?
当只对第一个进行初始化的时候,接下来的常量的值自增1。
#includeenum Sex{male=3,female,secret};int main(){printf("%d\n", male);printf("%d\n", female);printf("%d\n", secret);return 0;}
4、如果我要是对中间的枚举常量赋值,又会发生什么现象呢?
对中间的female进行初始化,只会影响下面的常量的取值,取值为初始化的自增1。
而其上面的常量则是不会受影响,依然从第一个常量值为0开始,自增1。
#includeenum Sex{male,female=5,secret};int main(){printf("%d\n", male);printf("%d\n", female);printf("%d\n", secret);return 0;}
5、枚举类型的使用
枚举类型的变量只能由枚举类型里面的常量来赋值。
#includeenum Sex{male,female,secret};int main(){//创建一个性别的枚举类型的变量//枚举类型的变量只能由枚举类型里面的常量来赋值enum Sex sex=male;//sex=3;//错误,sex是枚举类型,而3是整型,类型不匹配return 0;}
6、枚举类型的优势
大家可能都会有疑惑。define也能定义的常量,为什么还需要一个 枚举类型呢?
define | 枚举类型 |
一次只能定义一个常量 | 一次能定义多个常量 |
define运算仅满足替代原则 | 枚举类型里的常量和定义的变量运算无异 |
7、define的运算
define定义的常量的运算的原则是替代原则。
如果根据我们自己的理解,我们一开始会认为变量m,n的值是一样的,均为10200,而事实却非如此。
那编译器上的数是怎么来的呢?
#include#define a 100#define b 2#define c a+bint main(){int m,n;m = c * a;n = a * c;printf("%d\n%d", m,n);return 0;}
三、 联合体
1、联合体是什么
联合体也是一种特殊的结构体类型,也有一系列的成员。其特点就是所有成员共用一块空间。
2、联合体的格式
#includeunion s{char a;int b;};int main(){union s S;return 0;}
3、联合体赋值
#includeunion s{char a;int b;};int main(){union s S;S.a = 1;S.b = 2;return 0;}
4、联合体的大小
1、联合的大小至少是最大成员的大小。
2、当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍
#includeunion s{char a;int b;};int main(){printf("%d", sizeof(union s));return 0;}
谢谢大家的支持!