C语言enum枚举

开头

大家好,我叫这是我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;
}

……

结尾

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值