网站首页 > java教程 正文
引言
在日常编写代码或开源项目中,枚举(enum)数据类型到处可见,那么为什么要引入枚举这样的数据类型呢?枚举类型能带来哪些编程时的便利呢?首先枚举和宏定义有一定相似性,那么两者有什么区别呢?什么时候用枚举,什么时候用宏定义呢?今天我们就来聊聊枚举数据类型。
概念和一些特性
枚举(enum)在C语言中是一些符号常量集。通俗来说:枚举定义了一些符号,这些符号的本质就是int类型的常量,每个符号和一个常量绑定。枚举中的符号就表示一个自定义的一个识别码,编译器对枚举的认知就是符号常量所绑定的那个int类型的数字。
#include <stdio.h>
//枚举类型定义
enum weekdays
{
Monday = 1,
Tuesday,
Wednesday,
Thursday,
Friday,
Saturday,
Sunday,
};
int main(void)
{ //定义枚举变量day
enum weekdays day = Monday;
printf("day Value = %d.\n", day);
return 0;
}
简单分析下,首先我们定义了一个weekdays枚举类型,元素符号是从星期一(赋值为1)到星期天,然后定义了枚举变量day,并初始化为Monday,之后打印其值。
我们编译运行下:
可以看到day赋值为”Monday“,其值为1,与我们预想的一致。 相信这里有小伙伴就会提出如果在定义枚举类型时,没有初始化(即Monday=1),那么day的值是多少呢?那么我们来测试下,将以上的枚举改为如下:
//枚举类型定义
enum weekdays
{
Monday,
Tuesday,
Wednesday,
Thursday,
Friday,
Saturday,
Sunday,
};
然后,再次编译运行:
可以看到结果为0,因此这里可以引出一个结论:枚举类型在定义时,如果第一个元素符号没有指定值,那么默认其值为0。
OK,接下来我们定义多个枚举类型,并依次赋值为枚举中的元素符号,并打印它们的值,具体如下:
#include <stdio.h>
//枚举类型定义
enum weekdays
{
Monday,
Tuesday,
Wednesday,
Thursday,
Friday,
Saturday,
Sunday
};
int main(void)
{ //定义枚举变量day
enum weekdays day1 = Monday;
enum weekdays day2 = Tuesday;
enum weekdays day3 = Wednesday;
enum weekdays day4 = Thursday;
enum weekdays day5 = Friday;
enum weekdays day6 = Saturday;
enum weekdays day7 = Sunday;
printf("day Value = %d.\n", day1);
printf("day Value = %d.\n", day2);
printf("day Value = %d.\n", day3);
printf("day Value = %d.\n", day4);
printf("day Value = %d.\n", day5);
printf("day Value = %d.\n", day6);
printf("day Value = %d.\n", day7);
return 0;
}
编译运行:
从结果来看,我们可以得出另外一个结论:枚举类型中的元素符号在没有特别指定其值时,其值是自增长的(+1)。
接下来,我们再改造下枚举定义,我们对其一些元素符号指定值,具体如下:
//枚举类型定义
enum weekdays
{
Monday,
Tuesday,
Wednesday,
Thursday=4, //指定“Thursday”值为4
Friday,
Saturday=9, // //Saturday
Sunday
};
编译运行:
从结果中我们又可以总结出一个规律:我们可以指定枚举中任一元素符号的值,并且下一个符号的值是根据上的符号的值进行增长的。
枚举的作用
枚举本质是对一些数字,如0,1,2,3.... 进行符号编码,这样的好处就是编程时可以不用看数字而直接看符号,就能明白其实际含义,一目了然,否则我们很难或是很费劲看其他人写的代码(如代码中正确返回0,错误返回-1,而 用枚举TRUE, FLASE,就能非常清楚知道含义,使代码清晰化,这也是非常重要的编程技巧和习惯)。
另一方面,之前我们讲过的宏定义也是能将一些数字,转为用符号表示,但是宏定义并没有我们上述讲的枚举特性,每一个宏定义的符号或是表达式都是独立的,而我们枚举中的元素虽然是独立了,但是每个元素符号的值是有关联的(比如自增长)。
枚举的使用情景
当我们要定义的常量是一个有限集合时,如一个星期,星期一到星期日,一个月31天,一年12个月....等等,当然使用宏定义也行,但是使用枚举更适合。
而当一些常量符号之间无关联,或者是无限的情况下,更适合用宏定义。
总结
在C语言中是可以没有枚举类型的,我们完全可以用宏定义或者直接使用数字表示, 但是这样的编程习惯并不推荐,枚举的几点特性还是非常好用的,让我们的代码看起来非常工整,清晰:
- 枚举类型在定义时,如果第一个元素符号没有指定值,那么默认其值为0
- 枚举类型中的元素符号在没有特别指定其值时,其值是自增长的(+1)
- 我们可以指定枚举中任一元素符号的值,并且下一个符号的值是根据上的符号的值进行增长的
猜你喜欢
- 2024-12-06 你知道 Java 中关键字 enum 是一个语法糖吗?反编译枚举类
- 2024-12-06 java 枚举的使用
- 2024-12-06 java 枚举的定义与用法
- 2024-12-06 java枚举类型,为什么强烈推荐使用?看看它的7种场景方法
- 2024-12-06 Java 17 中枚举类型 Enum
- 2024-12-06 Java的枚举类型用法介绍
- 2024-12-06 讲解一下java枚举(enum)以及使用方法
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)