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;
}
相关推荐
夜猫逐梦1 小时前
【Lua】Windows 下编写 C 扩展模块:VS 编译与 Lua 调用全流程
c语言·windows·lua
_OP_CHEN2 小时前
数据结构(C语言篇):(十三)堆的应用
c语言·数据结构·二叉树·学习笔记·堆排序··top-k问题
量子炒饭大师2 小时前
收集飞花令碎片——C语言关键字typedef
c语言·c++·算法
cellurw3 小时前
Linux下C语言实现HTTP+SQLite3电子元器件查询系统
linux·c语言·http
..过云雨3 小时前
03.【Linux系统编程】基础开发工具1(yum软件安装、vim编辑器、编辑器gcc/g++)
linux·c语言·笔记·学习
青草地溪水旁3 小时前
Linux 高性能 I/O 事件通知机制的核心系统调用—— `epoll_ctl`
linux·c语言·c++
JasmineX-16 小时前
数据结构——顺序表(c语言笔记)
c语言·开发语言·数据结构·笔记
啟明起鸣6 小时前
【网络编程】从与 TCP 服务器的对比中探讨出 UDP 协议服务器的并发方案(C 语言)
服务器·c语言·开发语言·网络·tcp/ip·udp
番茄灭世神7 小时前
柔性数组与队列杂记
c语言
nightunderblackcat8 小时前
新手向:C语言、Java、Python 的选择与未来指南
java·c语言·python