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

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;}elseprintf("输入有误\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;}elseprintf("输入有误\n");}return 0;
}
http://www.lryc.cn/news/518829.html

相关文章:

  • spring boot 多数据源集成mysql、postgresql、phoenix、doris等
  • USB基础 -- USB 控制传输(Control Transfer)的重传机制
  • 云计算基础,虚拟化原理
  • 浮点数在C语言开发中为什么不精确?
  • ChatGPT网络错误如何解决
  • Vue3初学之插槽(slot)使用
  • 使用PVE快速创建虚拟机集群并搭建docker环境
  • 带格式 pdf 翻译
  • 【C++】C++11(一)
  • 初学stm32 --- ADC单通道采集
  • 【动态规划篇】欣赏概率论与镜像法融合下,别出心裁探索解答括号序列问题
  • Java(day7)
  • Word 转成pdf及打印的开源方案支持xp
  • LabVIEW软件侵权分析与应对
  • 【redis】centos7下安装redis7
  • [network]回顾:集线器(Hub)
  • 79 Openssl3.0 RSA公钥加密数据
  • EFCore HasDefaultValueSql (续2 HasComputedColumnSql)
  • 阿里巴巴TransmittableThreadLocal使用指南
  • ubuntu20下编译linux1.0 (part1)
  • 欧拉公式和傅里叶变换
  • Jenkins内修改allure报告名称
  • 30天开发操作系统 第 12 天 -- 定时器 v1.0
  • Ubuntu | PostgreSQL | 解决 ERROR: `xmllint` is missing on your system.
  • uniapp使用chooseLocation安卓篇
  • 《PC 上的开源神经网络多模态模型:开启智能交互新时代》
  • Apache JMeter 压力测试使用说明
  • 腾讯云AI代码助手编程挑战赛-知识百科AI
  • 【SpringAOP】Spring AOP 底层逻辑:切点表达式与原理简明阐述
  • HTTP-响应协议