C语言:枚举类型

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

enum Day//星期
{
 Mon,
 Tues,
 Wed,
 Thur,
 Fri,
 Sat,
 Sun
};
enum Sex//性别
{
 MALE,
 FEMALE,
 SECRET
};
enum Color//颜⾊
{
 RED,
 GREEN,
 BLUE
};

以上定义的 enum Day , enum Sex , enum Color 都是枚举类型。{}中的内容是枚举类型的可能取值,也叫枚举常量 。这些可能取值都是有值的,默认从0开始,依次递增1,当然在声明枚举类型的时候也可以赋初值。

#include <stdio.h>
enum Day//星期
{
	Mon,
	Tues,
	Wed,
	Thur,
	Fri,
	Sat,
	Sun
};
int main()
{
	printf("%d\n", Mon);
	printf("%d\n", Tues);
	printf("%d\n", Wed);
	printf("%d\n", Thur);
	printf("%d\n", Fri);
	printf("%d\n", Sat);
	printf("%d\n", Sun);
	return 0;
}

上面展示的就是枚举常量默认的取值,从0开始,然后不断往后加1。

#include <stdio.h>
enum Color//颜色
{
	RED = 2,
	GREEN = 4,
	BLUE = 8
};
int main()
{
	printf("%d\n", RED);
	printf("%d\n", GREEN);
	printf("%d\n", BLUE);
	return 0;
}

我们也可以在声明中通过直接初始化枚举常量。当然还有一种情况,我们可以和只初始化其中几个枚举常量,后面的枚举常量都会根据其前面的值加1递推。

#include <stdio.h>
enum Color//颜色
{
	RED = 2,
	GREEN = 4,
	BLUE
};
int main()
{
	printf("%d\n", RED);
	printf("%d\n", GREEN);
	printf("%d\n", BLUE);
	return 0;
}

二、枚举类型的优点
我们使用 #define 就可以 定义常量,为什么非要使用枚举?
其实枚举又有以下几个优点:
1.增加代码的可读性和可维护性
2.和#define定义的标识符比较枚举有类型检查,更加严谨
3.便于调试,预处理阶段会删除 #define 定义的符号
4.使用方便,一次可以定义多个常量
5.枚举常量是遵循作用域规则的,枚举声明在函数内,只能在函数内使用
三、枚举类型的使用

#include <stdio.h>
enum Color//颜色
{
	RED = 1,
    GREEN = 2,
	BLUE = 4
};
int main()
{
	enum Color clr = GREEN;//使用枚举常量给枚举变量赋值
	return 0;
}

枚举类型是一种自定义类型,它的定义和其他类型的变量类似,在上图的代码中clr就是创建出的一个枚举变量。如图,我们可以将枚举常量赋值给枚举变量。那我们是否可以拿整数直接给枚举变量赋值呢?这个做法在C语言中是可以的,但是在C++是不行的,因为C++的类型检查会比较严格。说了这么多,其实还是没能看出枚举的作用,在下面进行一个演示:我们之前在实现简易计算器的时候会这样来实现,那我们能不能使用枚举来对其进行优化呢?

#include<stdio.h>
void menu()
{
	printf("***0.exit***\n");
	printf("***1.add****\n");
	printf("***2.sub****\n");
	printf("***3.mul****\n");
	printf("***4.div****\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;
}
void is(int(*p)(int, int))
{
	int a, b;
	printf("请输入两个操作数...\n");
	scanf("%d%d", &a, &b);
	printf("结果是:%d\n", p(a, b));
}
int main()
{
	int n;
	int(*p[5])(int, int) = { 0,add,sub,mul,div };
	while (1)
	{
		menu();
		scanf("%d", &n);
		if (n > 0 && n < 5)
		{
			switch (n)
			{
			case 1:
			{
				is(add);
				break;
			}
			case 2:
			{
				is(sub);
				break;
			}
			case 3:
			{
				is(mul);
				break;
			}
			case 4:
			{
				is(div);
				break;
			}
			}
		}
		else if (n == 0)
		{
			printf("退出计算器\n");
			break;
		}
		else
			printf("输入有误\n");
	}
	return 0;
}

进行如下的改造我们就可以在选择语句选择函数时清楚地知道调用的是什么函数,这样就增加了代码的可读性。

#include<stdio.h>
void menu()
{
	printf("***0.exit***\n");
	printf("***1.add****\n");
	printf("***2.sub****\n");
	printf("***3.mul****\n");
	printf("***4.div****\n");
	printf("请输入...\n");
}
enum CAS
{
	EXIT,
	ADD,
	SUB,
	MUL,
	DIV
};
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;
}
void is(int(*p)(int, int))
{
	int a, b;
	printf("请输入两个操作数...\n");
	scanf("%d%d", &a, &b);
	printf("结果是:%d\n", p(a, b));
}
int main()
{
	int n;
	int(*p[5])(int, int) = { 0,add,sub,mul,div };
	while (1)
	{
		menu();
		scanf("%d", &n);
		if (n > 0 && n < 5)
		{
			switch (n)
			{
			case ADD:
			{
				is(add);
				break;
			}
			case SUB:
			{
				is(sub);
				break;
			}
			case MUL:
			{
				is(mul);
				break;
			}
			case DIV:
			{
				is(div);
				break;
			}
			}
		}
		else if (n == EXIT)
		{
			printf("退出计算器\n");
			break;
		}
		else
			printf("输入有误\n");
	}
	return 0;
}
相关推荐
灵哎惹,凌沃敏3 小时前
华为C语言编程规范总结
c语言·开发语言
范纹杉想快点毕业5 小时前
XML通过HTTP POST 请求发送到指定的 API 地址,进行数据回传
xml·c语言·开发语言·数据结构·c++·python·c#
float_六七6 小时前
C/C++头文件locale
c语言·开发语言·c++
誓约酱6 小时前
Linux下字符设备驱动编写(RK3568)
linux·运维·服务器·c语言·c++·嵌入式硬件·物联网
jie188945758666 小时前
c语言----------小知识
c语言·开发语言
2401_858286117 小时前
123.【C语言】数据结构之快速排序挖坑法和前后指针法
c语言·开发语言·数据结构·算法·排序算法
九离十8 小时前
C语言教程——指针进阶(1)
c语言·开发语言
羊小猪~~8 小时前
C/C++语言基础--C++STL库算法记录(质变算法、非质变算法、查找、排序、排列组合、关系算法、集合算法、堆算法等)
c语言·开发语言·数据结构·c++·算法·stl
码力全開11 小时前
C 语言奇幻之旅 - 第16篇:C 语言项目实战
c语言·开发语言·数据库·windows·vscode·vim·visual studio