C语言学习笔记-枚举

article/2023/10/1 3:11:58

C enum(枚举)

枚举是 C 语言中的一种基本数据类型,它可以让数据更简洁,更易读。
枚举是用来干嘛的?
枚举在C语言中其实是一些符号常量集。直白点说:枚举定义了一些符号,这些符号的本质就是int类型的常量,每个符号和一个常量绑定。这个符号就表示一个自定义的一个识别码,编译器对枚举的认知就是符号常量所绑定的那个int类型的数字。
一般情况下我们都不明确指定这个符号所对应的数字,而让编译器自动分配。

编译器自动分配的原则是:从0开始依次增加。如果用户自己定义了一个值,则从那个值开始往后依次增加。

C语言为何需要枚举?

C语言没有枚举是可以的。使用枚举其实就是对一些数字进行符号化编码,这样的好处就是编程时可以不用看数字而直接看符号。符号的意义是显然的,一眼可以看出。而数字所代表的含义除非看文档或者注释。

这么看来,宏定义也能实现呀!要专门弄个枚举类型干嘛?

宏定义和枚举有内在联系,宏定义和枚举经常用来解决类似的问题,他们俩基本相当可以互换,但是有一些细微差别。

宏定义和枚举的区别:
1、枚举是将多个有关联的符号封装在一个枚举中,而宏定义是完全散的。也就是说枚举其实是多选一,而且只能在这里面选,有时候有效防止其他不符数据的输入。
2、什么情况下用枚举?当我们要定义的常量是一个有限集合时(譬如一星期有7天,譬如一个月有31天,譬如一年有12个月····),最适合用枚举。(其实宏定义也行,但是枚举更好)
3、不适合用枚举的情况下(比如定义的常量符号之间无关联,或者无限的)用宏定义。

总结:宏定义先出现,用来解决符号常量的问题;后来人们发现有时候定义的符号常量彼此之间有关联(多选一的关系),用宏定义来做虽然可以但是不贴切,于是乎发明了枚举来解决这种情况。

枚举语法定义格式为:

enum 枚举名 {枚举元素1,枚举元素2,……};

在实际编程中,有些数据的取值往往是有限的,只能是非常少量的整数,并且最好为每个值都取一个名字,以方便在后续代码中使用,接下来我们举个例子,比如:一星期有 7 天,如果不用枚举,我们需要使用 #define 来为每个整数定义一个别名:

#define MON  1
#define TUE  2
#define WED  3
#define THU  4
#define FRI  5
#define SAT  6
#define SUN  7

这个看起来代码量就比较多,接下来我们看看使用枚举的方式:

enum DAY
{MON=1, TUE, WED, THU, FRI, SAT, SUN
};

这样看起来是不是更简洁了。

注意:第一个枚举成员的默认值为整型的 0,后续枚举成员的值在前一个成员上加 1。我们在这个实例中把第一个枚举成员的值定义为 1,第二个就为 2,以此类推。

可以在定义枚举类型时改变枚举元素的值:
 enum season {spring, summer=3, autumn, winter};
没有指定值的枚举元素,其值为前一元素加 1。也就说 spring 的值为 0,summer 的值为 3,autumn 的值为 4,winter 的值为 5

枚举变量的定义

前面我们只是声明了枚举类型,接下来我们看看如何定义枚举变量。

我们可以通过以下三种方式来定义枚举变量

1、先定义枚举类型,再定义枚举变量

enum DAY
{MON=1, TUE, WED, THU, FRI, SAT, SUN
};
enum DAY day;

2、定义枚举类型的同时定义枚举变量

enum DAY
{MON=1, TUE, WED, THU, FRI, SAT, SUN
} day;

3、省略枚举名称,直接定义枚举变量

enum
{MON=1, TUE, WED, THU, FRI, SAT, SUN
} day;

实例

#include <stdio.h>enum DAY
{MON=1, TUE, WED, THU, FRI, SAT, SUN
};int main()
{enum DAY day;day = WED;printf("%d",day);return 0;
}

以上实例输出结果为:

3

在C 语言中,枚举类型是被当做 int 或者 unsigned int 类型来处理的,所以按照 C 语言规范是没有办法遍历枚举类型的。

不过在一些特殊的情况下,枚举类型必须连续是可以实现有条件的遍历。

以下实例使用 for 来遍历枚举的元素:
实例

#include <stdio.h>enum DAY
{MON=1, TUE, WED, THU, FRI, SAT, SUN
} day;
int main()
{// 遍历枚举元素for (day = MON; day <= SUN; day++) {printf("枚举元素:%d \n", day);}
}

以上实例输出结果为:

枚举元素:1 
枚举元素:2 
枚举元素:3 
枚举元素:4 
枚举元素:5 
枚举元素:6 
枚举元素:7

以下枚举类型不连续,这种枚举无法遍历。

enum
{ENUM_0,ENUM_10 = 10,ENUM_11
};

枚举在 switch 中的使用:
实例

#include <stdio.h>
#include <stdlib.h>
int main()
{enum color { red=1, green, blue };enum  color favorite_color;/* 用户输入数字来选择颜色 */printf("请输入你喜欢的颜色: (1. red, 2. green, 3. blue): ");scanf("%u", &favorite_color);/* 输出结果 */switch (favorite_color){case red:printf("你喜欢的颜色是红色");break;case green:printf("你喜欢的颜色是绿色");break;case blue:printf("你喜欢的颜色是蓝色");break;default:printf("你没有选择你喜欢的颜色");}return 0;
}

以上实例输出结果为:

请输入你喜欢的颜色: (1. red, 2. green, 3. blue): 1
你喜欢的颜色是红色

将整数转换为枚举

以下实例将整数转换为枚举:
实例

#include <stdio.h>
#include <stdlib.h>int main()
{enum day{saturday,sunday,monday,tuesday,wednesday,thursday,friday} workday;int a = 1;enum day weekend;weekend = ( enum day ) a;  //类型转换//weekend = a; //错误printf("weekend:%d",weekend);return 0;
}

以上实例输出结果为:

weekend:1

http://www.ngui.cc/article/show-862291.html

相关文章

Linux之(20)arp命令

Linux之(19)IP命令总结 Author&#xff1a;OnceDay Date&#xff1a;2023年2月4日 漫漫长路&#xff0c;有人对你微笑过嘛… 参考文档&#xff1a; arp(8) - Linux manual page (man7.org)、彻底搞懂系列之&#xff1a;ARP协议 - 知乎 (zhihu.com)RFC 826: An Ethernet Add…

分享五款名不见经传但是非常实用的小众软件

我们在使用一些流行的软件的时候&#xff0c;往往会忽略一些知名度不高但是功能非常强大的软件&#xff0c;有的是因为小众&#xff0c;有的是因为名不见经传&#xff0c;总之因为不出名&#xff0c;有许多的好用的软件都不为大众所知道。 1. 多窗口管理——Multrin Multrin …

GcExcel-JAVA 6.0.3-Documents for Excel

在更短的时间内生成 Excel 电子表格&#xff0c;不依赖于 Excel&#xff01; 在任何应用程序中转换、计算、格式化和解析电子表格。快速高效&#xff1a;其轻巧的尺寸意味着 Documents for Excel 针对快速处理大型 Excel 文档进行了优化使用适用于 Windows、Linux 和 Mac 的 J…

ESP32 Arduino 学习篇(五)TFT_eSPI库

前期准备&#xff1a;1.TFT_eSPI库的安装首先在Libraries里面搜索安装TFT_eSPI库到你的工程文件里面。2.TFT_eSPI库的配置文件配置该库有User_Setup.h和 User_Setup_Select.h两个配置文件&#xff0c;支持 ①自定义参数或 ②使用已有配置 驱动TFT屏幕。User_Setup.h — 由自己定…

Python:最少刷题数

问题描述 小蓝老师教的编程课有 N 名学生, 编号依次是 1…N 。第 i 号学生这学期 刷题的数量是 Ai​ 。 对于每一名学生, 请你计算他至少还要再刷多少道题, 才能使得全班刷题 比他多的学生数不超过刷题比他少的学生数。 输入格式 第一行包含一个正整数 N 。 第二行包含 N …

c语言指针应用

1、数组元素的指针变量 &#xff08;1&#xff09;、数组元素的指针变量 和 数组名&#xff08;作为地址&#xff09;等价 #include <stdio.h> void test() {int arr[5] {10, 23, 7, 5, 56};int n sizeof(arr) / sizeof(arr[0]);for (int i 0; i < n; i){printf(&…

RDD 持久化

文章目录RDD 持久化1、RDD Cache 缓存2、持久化的作用3、RDD ChechPoint 检查点1) 说明2) 代码示例4、Cache & Persist & Checkpoint 区别RDD 持久化 1、RDD Cache 缓存 RDD 通过 Cache 或者 Persist 方法将前面的计算结果缓存&#xff0c;默认情况下会把数据以缓存在…

手机号和座机号正则表达式

phoneInputBlur (e, record) { const { value } e.target const reg /^1([358][0-9]|4[579]|66|7[0135678]|9[89])[0-9]{8}KaTeX parse error: Expected EOF, got & at position 26: … (value ! &̲& value ! nul…message.warn(‘手机号格式不正确&#xff0c…

超详细——入门Github的代码上传

Github的使用与Gitee相差无几&#xff0c;由于网速原因&#xff0c;国内开发者主要使用Gitee作为版本管理器&#xff0c;但有些场景及项目需要用到Github&#xff0c;今天我将对Github的使用制作一个简单的初学者入门教程&#xff0c;不足之处恳请指正。 一、创建代码仓库 1.…

Go第 17 章 :反射

Go第 17 章 &#xff1a;反射 17.1 先看一个问题&#xff0c;反射的使用场景 17.2 使用反射机制&#xff0c;编写函数的适配器, 桥连接 17.3 反射的基本介绍 17.3.1 基本介绍 反射可以在运行时动态获取变量的各种信息, 比如变量的类型(type)&#xff0c;类别(kind)如果是结构…