当前位置: 首页 > article >正文

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

http://www.kler.cn/a/469786.html

相关文章:

  • 新年感悟:2025年1月7日高铁随想
  • http源码分析
  • HarmonyOS-面试资料
  • 【论文复现】改进麻雀搜索算法优化冷水机组的最优负载调配问题
  • HTML5实现好看的博客网站、通用大作业网页模板源码
  • GPT分区 使用parted标准分区划分,以及相邻分区扩容
  • Markdown编辑器——Typora(Picgo+Github图床)
  • 【归一化】RMSNorm
  • 并发安全问题解析
  • 内核链表 例题 C语言实现
  • Qt——网络编程
  • 网络协议安全的攻击手法
  • 如何进行千万级别数据跑批优化
  • GitHub 基础使用指南
  • Go语言的 的数据封装(Data Encapsulation)核心知识
  • 深入了解 ES6 Map:用法与实践
  • Ruby语言的字符串处理
  • matlab中几个取整函数的区别
  • Django AWS负载均衡器管理系统
  • XXL-CRAWLER v1.4.0 | Java爬虫框架
  • stm32的掉电检测机制——PVD
  • spring mvc源码学习笔记之六
  • Git 部署
  • 【代码随想录】刷题记录(89)-分发糖果
  • 消防设施操作员考试题库及答案
  • springboot整合dubbo和nacos进行远程rpc调用案例