enum

enum 

enum是C语言中的一个关键字,enum叫枚举数据类型,枚举数据类型描述的是一组 整型值 的集合(这句话其实不太妥当),枚举型是预处理指令#define的替代,枚举和宏其实非常类似,宏在 预处理阶段 将名字替换成对应的值,枚举在 编译阶段 将名字替换成对应的值,
我们可以将枚举理解为编译阶段的宏,使用格式:
enum typeName{ valueName1, valueName2, valueName3, ...... };
typeName 枚举类型的名字 ,花括号里面的元素(枚举成员) 常量 而不是变量,这个一定要搞清楚,因为枚举成员的是常量, 所以不能对它们赋值,只能将它们的值赋给其他的变量

枚举类型(枚举标签)、枚举成员(枚举常量)、枚举变量之间的区别

当枚举类型和枚举变量放在一起定义时, 枚举类型的名字 (就是enum week中的week)可以省略不写,意思是上图的有两种写法
第一种:
enum week{Mon = 1, Tues, Wed, Thurs}num;
第二种:
enum {Mon = 1, Tues, Wed, Thurs}num;
这一点其实和结构体中的 无名结构很相似,虽然定义枚举类型变量和定义结构类型变量看起来很相似,但是两者的区别还是蛮大的,一个结构体类型变量里面包含若干个成员,相当于一个打包好的快递盒子,
而枚举类型变量就不一样了,枚举类型变量不是一个包含若干个成员的集合, 枚举类型变量和int、char类型的变量其实差不多,只不过枚举类型变量的赋值只能用自身的枚举成员来赋值,以上面的例子来说,
num的赋值就只能用枚举成员Mon、Tues、Wed、Thurs,而不能用其他枚举类型的枚举成员来赋值
定义枚举变量和定义结构体变量相同,有两种定义方法
第一种:(定义枚举类型的同时定义枚举变量)
enum week{Mon = 1, Tues, Wed, Thurs}num;
第二种:(先定义枚举类型,再定义枚举变量)
enum week{Mon = 1, Tues, Wed, Thurs};
enum week num;

枚举类型的特点

下面将用不同的示例来说明枚举类型的特点
示例一:(不显式说明枚举常量的值)
enum week{Mon, Tues, Wed, Thurs, Fri, Sat, Sun};
在没有显示说明的情况下,枚举常量(也就是花括号中的常量名)默认第一个枚举常量的值为0,往后每个枚举常量依次递增1 ,所以Mon=0,Tues=1,····Sun=6,下面来验证一下
enum week{Mon, Tues, Wed, Thurs, Fri, Sat, Sun};
printf("Mon=%d\nTues=%d\nWed=%d\nThurs=%d\nFri=%d\nSat=%d\nSun=%d\n", Mon, Tues, Wed, Thurs, Fri, Sat, Sun);
运行结果:
示例二:(显示说明部分枚举常量的值)
enum week{Mon = 1, Tues, Wed, Thurs, Fri, Sat, Sun};
上面的代码中,只显式说明了枚举常量Mon的值为1, 未指定的枚举名的值将依着最后一个指定值向后依次递增(注意是最后一个指定值)
enum week{Mon = 1, Tues, Wed, Thurs, Fri, Sat, Sun};
printf("Mon=%d\nTues=%d\nWed=%d\nThurs=%d\nFri=%d\nSat=%d\nSun=%d\n", Mon, Tues, Wed, Thurs, Fri, Sat, Sun);
运行结果:
对上面的代码稍加修改
enum week{Mon = 1, Tues, Wed, Thurs, Fri = 10, Sat, Sun};
printf("Mon=%d\nTues=%d\nWed=%d\nThurs=%d\nFri=%d\nSat=%d\nSun=%d\n", Mon, Tues, Wed, Thurs, Fri, Sat, Sun);
运行结果:
示例三:(对枚举变量进行赋值)
enum week{Mon = 1, Tues, Wed, Thurs}num;
num = (enum week)10;
printf("%d", num);
一个整数不能 直接赋值 给一个枚举变量,必须用该枚举变量所属的枚举类型进行类型强制转换后才能赋值 上面的代码中,在对枚举变量赋值10的时候进行的强制类型转换,将整型常量10转换成了enum week类型再赋值给num变量,
运行结果:
总结:
1、在没有显示说明的情况下,枚举常量(也就是花括号中的常量名)默认第一个枚举常量的值为0,往后每个枚举常量依次递增1
2、在部分显示说明的情况下,未指定的枚举名的值将依着之前最有一个指定值向后依次递增
3、一个整数不能 直接赋值 一个枚举变量,必须用该枚举变量所属的枚举类型进行类型强制转换后才能赋值
4、同一枚举类型中 不同 的枚举成员 可以具有相同的值
5、同一个程序中不能定义同名的枚举类型,不同的枚举类型中也不能存在同名的枚举成员(枚举常量)

enum与typedef配合使用

typedef enum week my;
或者
typedef enum week{Mon = 1, Tues, Wed, Thurs}my;
上面typedef也可以省略week
typedef enum{Mon = 1, Tues, Wed, Thurs}my;
上面两种形式中,my都是enum week的别名(意思是my和enum week等价),需要注意的是如果将第二句的 typedef 去掉那么 my 就变成了 enum week 类型的变量,如果加上 typedef 那么 my 就是 enum 的别名,这点要注意区分
在定义了enum week的别名my后,后面就可以使用my来定义 枚举类型变量
my num;
num = (enum week)10;
printf("%d", num);
上述语句中的(enum week),可以改为(my),两者效果是一样的
补充:对上面总结的第五点: 同一个程序中不能定义同名的枚举类型,不同的枚举类型中也不能存在同名的枚举成员(枚举常量) 进行验证
enum m1{m1, m2};
enum m2{m3, m4};
enum m1{m5, m6};
上述代码定义的枚举类型enum m1多次定义,是不允许的,编译器会报错 还有一种特殊情况,即使定义了同名的枚举类型,编译器也不会报错
enum m1{m1, m2};
enum m2{m3, m4};
enum m1;
上面的代码中,第二个enum m1没有定义枚举成员,在编译阶段是不会报错的( 估计是编译器并不认为定义了枚举成员的enum m1 和 没有定义枚举成员的enum m1是同名的枚举类型
enum的赋值范围
这个也是无意间注意到的,文章在开头提到枚举类型描述的是一组 整型值 的集合,枚举类型的占的字节数是4个字节,所以我们可以用INT_MAX和INT_MIN来测试枚举类型的赋值范围,赋值的最大值应该是INT_MAX(也就是2147483647),下面用代码来测试一下
enum test{m1=INT_MAX};
printf("%d\n%d\n", m1, INT_MAX);
运行结果:
上面的代码没有问题,下面来测试一下越界的赋值
enum test{m1=INT_MAX+1};
printf("%d\n%d\n", m1, INT_MAX);
 编译器在编译阶段会有警告 ,测试了枚举类型的最大值,下面来测试下枚举类型的最小值
enum test{m1=INT_MIN};
printf("%d\n%d\n", m1, INT_MIN);
运行结果:
上面的代码没有问题,下面来测试一下越界的赋值
enum test{m1=INT_MIN-1};
printf("%d\n%d\n", m1, INT_MIN);
和上面相同,编译器也会有警告

为什么“枚举类型描述的是一组整型值的集合”其实不太妥当?

上面这句话很容易让读者以为enum类型和int类型是等价的,好像可以把int型的数据直接赋值给enum变量,实际上是不行的,需要进行强制类型转换,C语言提供了一种称为“枚举”的类型,其中一个枚举常量的占的字节数为4个字节,恰好和int类型的变量占的字节数相同,假设把这些枚举常量说明为整型,字符型或其他类型显然是不妥当的,因为枚举类型是一种 基本数据类型 ,而不是一种构造类型,它不能再分解为什么基本类型
基于SSM框架的智能家政保洁预约系统,是一个旨在提高家政保洁服务预约效率和管理水平的平台。该系统通过集成现代信息技术,为家政公司、家政服务人员和消费者提供了一个便捷的在线预约和管理系统。 系统的主要功能包括: 1. **用户管理**:允许消费者注册、登录,并管理他们的个人资料和预约历史。 2. **家政人员管理**:家政服务人员可以注册并更新自己的个人信息、服务类别和服务时间。 3. **服务预约**:消费者可以浏览不同的家政服务选项,选择合适的服务人员,并在线预约服务。 4. **订单管理**:系统支持订单的创建、跟踪和管理,包括订单的确认、完成和评价。 5. **评价系统**:消费者可以在家政服务完成后对服务进行评价,帮助提高服务质量和透明度。 6. **后台管理**:管理员可以管理用户、家政人员信息、服务类别、预约订单以及处理用户反馈。 系统采用Java语言开发,使用MySQL数据库进行数据存储,通过B/S架构实现用户与服务的在线交互。系统设计考虑了不同用户角色的需求,包括管理员、家政服务人员和普通用户,每个角色都有相应的权限和功能。此外,系统还采用了软件组件化、精化体系结构、分离逻辑和数据等方法,以便于未来的系统升级和维护。 智能家政保洁预约系统通过提供一个集中的平台,不仅方便了消费者的预约和管理,也为家政服务人员提供了一个展示和推广自己服务的机会。同时,系统的后台管理功能为家政公司提供了强大的数据支持和决策辅助,有助于提高服务质量和管理效率。该系统的设计与实现,标志着家政保洁服务向现代化和网络化的转型,为管理决策和控制提供保障,是行业发展中的重要里程碑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值