c语言自定义类型枚举,联合(枚举的巧妙使用,联合体大小的计算)

Posted Ischanged

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c语言自定义类型枚举,联合(枚举的巧妙使用,联合体大小的计算)相关的知识,希望对你有一定的参考价值。


坚持到最后的那一刻就会看到胜利的曙光。

枚举

枚举顾名思义就是一一列举。 把可能的取值一一列举。 比如我们现实生活中: 一周的星期一到星期日是有限的7天,可以一一列举。性别有:男、女、保密,也可以一一列举。 月份有12个月,也可以一一列举 这里就可以使用枚举了

枚举类型的定义

如何定义枚举类型呢?
其实枚举类型和结构体很相似,我们可以对比着来记忆,**对于枚举花括号里面的值是枚举的可能取值,创建枚举变量时变量的值是其中的可能值,但如果创建了结构体变量,花括号里面的成员都属于结构体变量的内容,**我们要注意区分,枚举类型的定义如下

enum tag
	
	member - list;
	ariable - list;

枚举标签:tag
枚举类型:eum tag
枚举的可能取值:member_list
枚举的变量列表:variable_list**

枚举类型定义的例子:

enum Day//星期

	Mon,
	Tues,
	Wed,
	Thur,
	Fri,
	Sat,
	sun
;
enum sex//性别

	MALE,
	FEMALE,
	SECRET
;
enum color//颜色--三原色 rgb

	RED,
	GREEN,
	BLUE
;

以上定义的 enum Day , enum Sex , enum Color 都是枚举类型。 中的内容是枚举类型的可能取值,也叫 枚举常量 。为什么叫枚举常量呢?因为这些可能取值能表达一些常量数值,数值的类型为int 类型。
这些可能取值都是有值的,默认从0开始,依次递增1,当然在定义的时候也可以赋初值。(常量也可以赋初值,没有改变常量的值)
例如:

enum Color
	
		RED ,
		GREEN ,
		BLUE
	;
#include<stdio.h>
	int main()
	

		printf("%d\\n", RED);
		printf("%d\\n", GREEN);
		printf("%d\\n", BLUE);
        //打印结果0,1,2
		return 0;
	

通过对枚举成员赋初值,改变枚举常量的默认大小,打印结果为0,2,3

	#include<stdio.h>
	enum Color
	
		RED ,//0
		GREEN = 2,//2
		BLUE//3
	;

	int main()
	
		enum Color c = BLUE;
		//enum Color c = 8;

		printf("%d\\n", sizeof(c));



		return 0;
	

接下来我们在看下面的代码,我们通过enum
Color类型定义了一个枚举变量c,变量的取值为枚举类型里面的成员,把BLUE赋值给变量c,c的值也就是3,那可不可以把3直接赋值给c呢?不可以,因为枚举变量的可能取值为枚举类型里面的取值,值的类型为枚举类型,虽然3和枚举常量的值是一样的,但它们属于不同的类型(枚举类型是枚举类型,整形是整形),对于c++编译器,运行如下代码就会报错,(c++编译器检测更严格)对于c的编译器就不会报错

#include<stdio.h>
	enum Color
	
		RED ,//0
		GREEN = 2,//2
		BLUE//3
	;

	int main()
	
		//CPP 语法检查更加严格
		//enum Color c = BLUE;
		enum Color c = 3;

		printf("%d\\n", sizeof(c));



		return 0;
	

枚举的优点

为什么使用枚举?我们可以使用 #define 定义常量,为什么非要使用枚举? 枚举的优点:

  1. 增加代码的可读性和可维护性
  2. 和#define定义的标识符比较枚举有类型检查,更加严谨。(#define 定义的宏只是简单的符号替换没有什么类型,而枚举是一种类型,在数据的赋值的时候有类型的检查)
  3. 防止了命名污染(#define 定义的宏是一种全局变量,枚举常量是定义在枚举类型里面的)
  4. 便于调试(#define 定义的宏在调试之前已经完成替换了,后面调试不好看)
  5. 使用方便,一次可以定义多个常量

如下代码,假设我们要实现一个简单的计算器,我们从键盘上面输入数字0,1,2,3,4分别运行执行退出,加减乘除
通过switch语句分别实现相应的功能,case语句后面的数字只有单一的意思,如果不看代码及解释,不是很快地读懂代码,如果通过枚举的定义,ADD不仅表示执行加法,也表示语句后面有加法函数,这样可以使代码的可读性,和维护性提高了,

//  0. exit 1. add    2. sub 
//	 3. mul    4. div 
enum Option

	EXIT,//0
	ADD,//1
	SUB,//2
	MUL,//3
	DIV//4
;
#include<stdio.h>
int main()

	int input = 0;
	do
	
	
		printf("请选择:>");
		scanf("%d", &input);
		switch (input)
		
		case 1://ADD
			break;
		case 2://SUB
			break;
		case 3://MUL
			break;
		case4://DIV
			break;
		case 0://EXIT
			break;
		default:
			break;
		
	 while (input);


	return 0;

枚举的使用

简单简单计算器的实现

#include<stdio.h>
enum option//定义枚举类型option

	EXIT,//0
	ADD,//1
	SUB,//2
	MUL,//3
	DIV//4
;
void menu()

	printf("******************************************\\n");
	printf("******   1. add      2.sub           *****\\n");
	printf("******   2.mul       4.div           *****\\n");
	printf("******          0.exit               *****\\n");
	printf("******************************************\\n");


int add(int x, int y)//加法

	return x + y;

int sub(int x, int y)//减法

	return x - y;

int mul(int x, int y)//乘法

	return x * y;

int div(int x, int y)//除法

	return x / y;

int main()

	enum option input = EXIT;
	int x = 0;
	int y = 0;

	do
	
		menu();

		printf("请选择:>");
		scanf("%d", &input);
		switch (input)
		
		case ADD:
			printf("请输入两个操作数:>");
			scanf("%d %d", &x, &y);
			printf("%d\\n", add(x, y));
			break;
		case SUB:
			printf("请输入两个操作数:>");
			scanf("%d %d", &x, &y);
			printf("%d\\n", sub(x, y));
			break;
		case MUL:
			printf("请输入两个操作数:>");
			scanf("%d %d", &x, &y);
			printf("%d\\n", mul(x, y));
			break;
		case DIV:
			printf("请输入两个操作数:>");
			scanf("%d %d", &x, &y);
			printf("%d\\n", div(x, y));
			break;
		case EXIT:
			printf("退出计算机\\n");
			break;
		default:
			printf("输入错误,请重新输入\\n");
			break;
		

	 while (input);
	return 0;

联合(共用体)

联合体类型的定义

联合也是一种特殊的自定义类型 这种类型定义的变量也包含一系列的成员,特征是这些成员公用同一块 空间(所以联合也叫共用体)。 比如:

//联合类型的声明
union Un

char c;
int i;
;
//联合变量的定义
union Un un;
//计算连个变量的大小
printf("%d\\n", sizeof(un));

联合的特点

联合的成员是共用同一块内存空间的,这样一个联合变量的大小,至少是最大成员的大小(因为联合至少得有能力保存最大的那个成员)。

#include<stdio.h>
union Un

	int i;
	char c;
;


int main()

	union Un un;
	// 下面输出的结果是一样的吗?
	printf("%d\\n", &(un.i));
	printf("%d\\n", &(un.c));
	//下面输出的结果是什么?

	return 0;


从上面代码的执行结果可以看出,**在创建联合体成员变量的时候,他们都是从同一起始位置开始创建,开辟空间的,**所以联合体成员变量的内存空间是有所重叠,覆盖的,因此计算联合体大小的时候有所不同。

联合大小的计算

  • 联合的大小至少是最大成员的大小。
  • 当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍
    如我们计算如下代码:
#include<stdio.h>
union Un1

	char c[5];
	int i;
;
union Un2

	short c[7];
	int i;
;

int main()

	printf("%d\\n", sizeof(union Un1));//8
	printf("%d\\n", sizeof(union Un2));//16

	return 0;


图示理解:

以上是关于c语言自定义类型枚举,联合(枚举的巧妙使用,联合体大小的计算)的主要内容,如果未能解决你的问题,请参考以下文章

C语言自定义数据类型:结构体,枚举,联合

C语言自定义数据类型:结构体,枚举,联合

C语言自定义数据类型:结构体,枚举,联合

c语言篇 +自定义类型(枚举联合结构体)以及位段

C语言学习笔记(15)自定义类型:结构体,枚举,联合

“解剖”c语言——自定义类型(结构体,位段,枚举,联合体)