当前位置:网站首页>C:枚举的优缺
C:枚举的优缺
2022-08-10 16:31:00 【风静如云】
C语言可以通过两种方式定义常量:
1.#define宏定义
2.enum枚举定义
使用#define宏定义的缺点是,其属于预编译阶段常量,其名字会被预编译器替换为数值,这样在编译阶段,其名字已经不会再出现。
只用enum枚举定义,其名字在编译阶段依然是可见的。
定义枚举常量的方式为:
enum Color{red, green, blue};
其中枚举类型名Color是可选的。
在没有为枚举常量设置值时
,枚举类型中的第一个枚举常量
的值为0,第二个为1,以此类推。
如果指定了枚举常量
的值,那么后续枚举常量
的值依次加1.
#include <stdio.h>
int main()
{
enum Color{red, yellow, green=5, blue, white=1 };
printf("%d %d %d %d %d\n", red, yellow, green, blue, white);
return 0;
}
运行程序输出:
0 1 5 6 1
red,由于没有被设置值,因此默认值为0
yellow,基于red加1,值为1
green,被指定了值,值为5
blue,基于green加1,值为6
white,被指定了值,值为1
需要注意的是,枚举常量一旦被初始化后,其值是不能被更改的,也正因为如此才被称为枚举常量。
可以通过如下方式定义枚举变量:
#include <stdio.h>
int main()
{
enum Color{red, yellow, green=5, blue, white=1 };
enum Color c1 = green;
enum Color c2 = (Color)9; //不能直接用整数为枚举变量赋值
printf("%d %d\n", c1, c2);
return 0;
}
运行程序输出:
5 9
c1,枚举变量被定义为green,值为5
c2,枚举变量被定义了一个不存在的枚举值,值为9
另外需要注意的是,不能在同一个作用域内定义相同名字的枚举常量,即使这些常量位于不同的枚举类型名:
#include <stdio.h>
int main()
{
enum Color{red, yellow, green=5, blue, white=8 };
enum Wine{red, white};
printf("%d %d %d\n", red, white, blue);
return 0;
}
编译错误:
error: 'red' conflicts with a previous declaration
error: 'white' conflicts with a previous declaration
在不同的作用域内定义的枚举常量,相同名字的枚举常量会被掩盖:
#include <stdio.h>
enum Color{red, yellow, green=5, blue, white=8 };
int main()
{
enum Wine{red, white};
printf("%d %d %d\n", red, white, blue);
return 0;
}
运行程序输出:
0 1 6
Wine内定义的red和white与Color定义的red和white具有相同的枚举常量名,但由于定义在不同的作用域内,因此Wine的局部作用域red和white掩盖了全局作用域内的Color的red和white
但是Wine没有定义blue,所以blue的值依然为全局作用域Color定义的枚举常量
通过以上几个程序可以看到,枚举在使用时有几点异于常规:
1.枚举的常量值,不需要通过其枚举常量名,可以直接使用
2.不同的枚举常量可以拥有相同的值
3.枚举变量可以被赋值一个不存在的枚举常量值
4.在相同作用域内的枚举名不能重复
对于这些不足,C++11引入了枚举类,可以更好的使用枚举
边栏推荐
- 1001 A+B Format(字符串处理)
- 轮询以及webSocket与socket.io原理
- 电力系统潮流计算(牛顿-拉夫逊法、高斯-赛德尔法、快速解耦法)【6节点 9节点 14节点 26节点 30节点 57节点】(Matlab代码实现)
- 烟雾、空气质量、温湿度...自己徒手做个环境检测设备
- 如何修改gif尺寸?1分钟教你快速修改gif尺寸
- C language symbols on how to use
- How to realize full backup and incremental backup of MySQL database
- 国内油价四连跌,但下跌趋势可能终止
- CDF 图的含义
- Basic knowledge of software engineering--requirements analysis
猜你喜欢
随机推荐
聊聊云原生数据平台
电力系统潮流计算(牛顿-拉夫逊法、高斯-赛德尔法、快速解耦法)【6节点 9节点 14节点 26节点 30节点 57节点】(Matlab代码实现)
Bitwarden:免费、开源的密码管理服务
蓝桥ROS之 cmake gcc g++ 默认版本和升级
LeetCode-876. Middle of the Linked List
烟雾、空气质量、温湿度...自己徒手做个环境检测设备
sprintboot验证码kaptcha 自定义图片样式
接口测试中,应不应该用数据库
找到一个超级神奇,百试百灵的解决 ModuleNotFoundError: No module named xxx 的方法
数学基础(五)最优化理论(最优化,无约束,有约束,拉格朗日乘子的意义,KKT条件)
如何将jpg图片变成gif?教你一分钟图片合成gif的方法
Yi Gene|In-depth review: epigenetic regulation of m6A RNA methylation in brain development and disease
Kubernetes kube-proxy工作原理
C language symbols on how to use
#夏日挑战赛#【ELT.ZIP】啃论文俱乐部——学术科研方法论沉淀辑
生成树协议(STP---Spanning Tree Protocol)
怎么截取视频做gif动图?手把手教你视频在线转gif制作
Redis存储验证码
被大厂面试官参考的Redis笔记,堪称Redis面试天花板
2022 CCF China Open Source Conference Notice (Fourth Round)