目录
- 开头
- 1.什么是枚举?
- 2.枚举的优缺点
- 优点
- 缺点
- 3.枚举的实际用途(这里只列举其一)
- 简易计算器枚举版
- ……
- 结尾
开头
大家好,我叫这是我58。今天,我们要学关于C语言枚举的一些知识。
1.什么是枚举?
枚举,就是一一列举的意思,比如12个月就可以一一列举,三原色也可以一一列举,而东南西北这四个方向还可以一一列举,那么,枚举该怎样写呢?其实,枚举是这样写的:
enum RGB {
RED,
GREEN,
BLUE
};
其中,enum
是枚举的关键字,RGB
是枚举的名称,而RED
,GREEN
和BLUE
则是枚举RGB
的成员变量(这些成员变量的大小都等于int
类型的大小),那么,这个RGB
枚举里的RED
,GREEN
和BLUE
分别为什么值呢?如果想的话,那就一起看看这下面的三行代码吧。
printf("%d\n", RED);
printf("%d\n", GREEN);
printf("%d\n", BLUE);
经过这三行代码的打印之后,我们就会看到这打印出来的三个数字了,并且,从这张图片中,我们可以得知枚举RGB
中的RED
为0
,GREEN
为1
,BLUE
为2
了,因此,从这之中,我们知道了关于枚举的一个知识:枚举中的成员变量都是从上往下逐渐加1的。而在这之中,我们可以改变枚举里的成员变量的值吗?我的回答是可以,因为这就是改变枚举里的成员变量RED
的值的方法:
enum RGB {
RED = 7,
GREEN,
BLUE
};
现在,我们再用刚才用来打印枚举RGB
里的所有成员变量的三段程序来运行一下,结果是这样子的:,从这三个被打印出来的数字中可以得知现在枚举RGB
里的RED
,GREEN
和BLUE
分别为7
,8
和9
了,因此,我们就知道枚举改变变量的方法就是跟赋值的方法一模一样了。那么,枚举变量到底是怎么在主函数存储的呢?其实,最好的答案就是这样:
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;
}
……
结尾
在你看到这里之后,可以评论来互动一下我哦。