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

C语言enum枚举

目录

  • 开头
  • 1.什么是枚举?
  • 2.枚举的优缺点
    • 优点
    • 缺点
  • 3.枚举的实际用途(这里只列举其一)
    • 简易计算器枚举版
    • ……
  • 结尾

开头

大家好,我叫这是我58。今天,我们要学关于C语言枚举的一些知识。

1.什么是枚举?

枚举,就是一一列举的意思,比如12个月就可以一一列举,三原色也可以一一列举,而东南西北这四个方向还可以一一列举,那么,枚举该怎样写呢?其实,枚举是这样写的:

enum RGB {RED,GREEN,BLUE
};

其中,enum是枚举的关键字,RGB是枚举的名称,而REDGREENBLUE则是枚举RGB的成员变量(这些成员变量的大小都等于int类型的大小),那么,这个RGB枚举里的REDGREENBLUE分别为什么值呢?如果想的话,那就一起看看这下面的三行代码吧。

printf("%d\n", RED);
printf("%d\n", GREEN);
printf("%d\n", BLUE);

经过这三行代码的打印之后,我们就会看到这打印出来的三个数字了,并且,从这张图片中,我们可以得知枚举RGB中的RED0GREEN1BLUE2了,因此,从这之中,我们知道了关于枚举的一个知识:枚举中的成员变量都是从上往下逐渐加1的。而在这之中,我们可以改变枚举里的成员变量的值吗?我的回答是可以,因为这就是改变枚举里的成员变量RED的值的方法:

enum RGB {RED = 7,GREEN,BLUE
};

现在,我们再用刚才用来打印枚举RGB里的所有成员变量的三段程序来运行一下,结果是这样子的:,从这三个被打印出来的数字中可以得知现在枚举RGB里的REDGREENBLUE分别为789了,因此,我们就知道枚举改变变量的方法就是跟赋值的方法一模一样了。那么,枚举变量到底是怎么在主函数存储的呢?其实,最好的答案就是这样:

enum RGB r = RED;

在这之中,enum为枚举的关键字,RGB为枚举的名称,r为枚举RGB的变量,RED则是枚举RGB的成员变量。之后,我们把枚举RGB的成员变量RED不赋值之后,我们就执行了:printf("%d\n", r);这样的函数了,执行之后,我们就发现这个函数输出一个7了,由此可以得知,enum RGB r = RED;是目前最没有问题的枚举变量在主函数存储的方式了,而后面,我们又测试了int r = RED;这段代码是否可行,却发现int r = RED;这段代码在C语言里是没有看出什么问题,而int r = RED;这段代码在C++中就爆出问题来了,由此也可以说明C++比C语言的类型检查的更严格。在看到这里之后,关于枚举的基本介绍就基本的讲完了。

2.枚举的优缺点

优点

  • 防止命名污染
  • 增加代码的可维护性和可读性,更能让人理解代码的意思
  • #define定义的标识符比较酶具有类型检查,更加严谨
  • 便于调试
  • 使用方便,一次可以定义多个常量

缺点

  • 暂无

3.枚举的实际用途(这里只列举其一)

简易计算器枚举版

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <math.h>
enum Option {ADD = 1,SUM,TIM,DIV,MOD,POW,LMOVE,RMOVE
};
int Add(int i, int ia) {return i + ia;
}
int Sum(int i, int ia) {return i - ia;
}
int Tim(int i, int ia) {return i * ia;
}
int Div(int i, int ia) {return i / ia;
}
int Mod(int i, int ia) {return i % ia;
}
int Pow(int i, int ia) {return (int)pow(i, ia);
}
int Rmv(int i, int ia) {return i >> ia;
}
int Lmv(int i, int ia) {return i << ia;
}
void calc(int(*funp)(int, int)) {int i = 0;int ia = 0;printf("请输入你要计算的两个整型 -> ");scanf("%d %d", &i, &ia);printf("计算的结果为:%d", funp(i, ia));
}
int main() {int i = 0;printf("**********************************\n");printf("* 1.Add(+)   2.Sum(-)   3.Tim(*) *\n");printf("* 4.Div(/)   5.Mod(%c)   6.Pow(^) *\n", '%');printf("* 7.Rmv(>>)  8.Lmv(<<)           *\n");printf("**********************************\n");scanf("%d", &i);switch (i) {case ADD:calc(Add);break;case SUM:calc(Sum);break;case TIM:calc(Tim);break;case DIV:calc(Div);break;case MOD:calc(Mod);break;case POW:calc(Pow);break;case LMOVE:calc(Lmv);break;case RMOVE:calc(Rmv);break;default:break;}return 0;
}

……

结尾

在你看到这里之后,可以评论来互动一下我哦。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【数据结构】详细介绍栈和队列,解析栈和队列每一处细节
  • 基础第3关:LangGPT结构化提示词编写实践
  • VS2022上面运行QT程序
  • docker-实战——consul集群
  • 如何将老照片修复模糊照片变清晰?照片修复方法
  • 宏定义———C语言
  • 数据结构之排序(下)
  • 【图像去雾系列】使用SSR/MSR/MSRCR/MSRCP/automatedMSRCR算法对单图像进行图像增强,达到去雾效果
  • 【C++二分查找 前缀和 】1292. 元素和小于等于阈值的正方形的最大边长
  • 主流AI绘画工具StableDiffusion最新模型sd3本地部署方法(附工作流)
  • 螺旋矩阵 II(LeetCode)
  • ros2_control_py 使用教程
  • Java二十三种设计模式-备忘录模式(19/23)
  • SPDY是何方神圣
  • \r和\n不同系统的区别
  • fetch 从初识到应用
  • iOS帅气加载动画、通知视图、红包助手、引导页、导航栏、朋友圈、小游戏等效果源码...
  • MySQL主从复制读写分离及奇怪的问题
  • PHP那些事儿
  • Protobuf3语言指南
  • webgl (原生)基础入门指南【一】
  • Webpack 4x 之路 ( 四 )
  • 给Prometheus造假数据的方法
  • 理解在java “”i=i++;”所发生的事情
  • 排序(1):冒泡排序
  • 树莓派 - 使用须知
  • 系统认识JavaScript正则表达式
  • 以太坊客户端Geth命令参数详解
  • 云大使推广中的常见热门问题
  • 关于Android全面屏虚拟导航栏的适配总结
  • 新年再起“裁员潮”,“钢铁侠”马斯克要一举裁掉SpaceX 600余名员工 ...
  • ​​​【收录 Hello 算法】10.4 哈希优化策略
  • ######## golang各章节终篇索引 ########
  • #13 yum、编译安装与sed命令的使用
  • (02)vite环境变量配置
  • (Arcgis)Python编程批量将HDF5文件转换为TIFF格式并应用地理转换和投影信息
  • (附源码)基于ssm的模具配件账单管理系统 毕业设计 081848
  • (附源码)计算机毕业设计SSM基于java的云顶博客系统
  • (附源码)计算机毕业设计SSM教师教学质量评价系统
  • (回溯) LeetCode 46. 全排列
  • (简单有案例)前端实现主题切换、动态换肤的两种简单方式
  • (七)Knockout 创建自定义绑定
  • (转)程序员疫苗:代码注入
  • (转)关于如何学好游戏3D引擎编程的一些经验
  • (最完美)小米手机6X的Usb调试模式在哪里打开的流程
  • *算法训练(leetcode)第四十五天 | 101. 孤岛的总面积、102. 沉没孤岛、103. 水流问题、104. 建造最大岛屿
  • .NET C# 使用GDAL读取FileGDB要素类
  • .NET Framework 的 bug?try-catch-when 中如果 when 语句抛出异常,程序将彻底崩溃
  • .net 后台导出excel ,word
  • .NET 漏洞分析 | 某ERP系统存在SQL注入
  • .NET 中使用 TaskCompletionSource 作为线程同步互斥或异步操作的事件
  • .NET/C# 的字符串暂存池
  • .Net组件程序设计之线程、并发管理(一)
  • @NestedConfigurationProperty 注解用法
  • @NotNull、@NotEmpty 和 @NotBlank 区别