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