该文章的上一篇文章: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枚举类型
一次只能定义一个常量一次能定义多个常量
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;}

谢谢大家的支持!