当前位置:网站首页>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引入了枚举类,可以更好的使用枚举
边栏推荐
猜你喜欢
随机推荐
babylonjs shader
网页分析和一些基础题目
聊聊云原生数据平台
接口测试中,应不应该用数据库
电力系统潮流计算(牛顿-拉夫逊法、高斯-赛德尔法、快速解耦法)【6节点 9节点 14节点 26节点 30节点 57节点】(Matlab代码实现)
植物肉,为何在中国没法“真香”?
字符串压缩(三)之短字符串压缩
PNG如何变gif?教你一招png秒变gif动图的方法
北海 Kraken:基于 Flutter 构建的高性能 Web 渲染引擎
shell之正则表达式及三剑客awk命令
[FreeRTOS] 13 Dynamic Memory Management
软件配置 | pip下载第三方库文件及配置pip源的不完全总结
直播预告|从新手村到魔王城,高效默契的敏捷团队如何炼成
x64汇编代码测试 用户模式和内核模式
rtsp 和 rtmp 推流(一)
C专家编程 第10章 再论指针 10.3 在锯齿状数组上使用指针
glui.h无法找到描述+解决+测试
v-on补充:自定义参数传递和事件修饰符
一文带你彻底拿下a,b两点间等效电阻
不同主机收不到组播消息原因分析