C/C++自定义类型(2)细节满满!

该文章的上一篇文章: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、我们可以对其进行初始化,让其代表的值可以是我们自己认为的值。

#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;
}

C/C++自定义类型(2)细节满满!_第1张图片

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;
}

C/C++自定义类型(2)细节满满!_第2张图片

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;
}

C/C++自定义类型(2)细节满满!_第3张图片

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;
}

C/C++自定义类型(2)细节满满!_第4张图片

5、枚举类型的使用 

枚举类型的变量只能由枚举类型里面的常量来赋值。 

#include
enum 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,而事实却非如此。 

那编译器上的数是怎么来的呢?

C/C++自定义类型(2)细节满满!_第5张图片

#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;
}

C/C++自定义类型(2)细节满满!_第6张图片

三、 联合体

 1、联合体是什么 

联合体也是一种特殊的结构体类型,也有一系列的成员。其特点就是所有成员共用一块空间。

2、联合体的格式

#include
union s
{
	char a;
	int b;
};
int main()
{
	union s S;
	return 0;
}

3、联合体赋值

#include
union s
{
	char a;
	int b;
};
int main()
{
	union s S;
	S.a = 1;
	S.b = 2;
	return 0;
}

4、联合体的大小 

1、联合的大小至少是最大成员的大小。
2、当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍

C/C++自定义类型(2)细节满满!_第7张图片

#include
union s
{
	char a;
	int b;
};
int main()
{
	printf("%d", sizeof(union s));
	return 0;
}

C/C++自定义类型(2)细节满满!_第8张图片

 谢谢大家的支持!

你可能感兴趣的:(C语言疑难,c语言,c++)