当前位置:网站首页>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引入了枚举类,可以更好的使用枚举
边栏推荐
猜你喜欢

MySQL的使用演示及操作,MySQL数据字符集的设置

面了个腾讯25k+出来的,他让我见识到什么基础的天花板

怎么截取视频做gif动图?手把手教你视频在线转gif制作

软件配置 | pip下载第三方库文件及配置pip源的不完全总结

植物肉,为何在中国没法“真香”?

Gif动图制作怎么在线操作?一招教你快速完成gif在线制作

数学基础(五)最优化理论(最优化,无约束,有约束,拉格朗日乘子的意义,KKT条件)

Embedded Development: Embedded Basics - Mapping Peripherals Using Arrays of Pointers

kuangbin专题一 简单搜索
![PC软件问题二[Win10系统将UltraEdit添加到右键菜单的方法]](/img/4f/f3856e135302bcf5902bf987b7ed4d.png)
PC软件问题二[Win10系统将UltraEdit添加到右键菜单的方法]
随机推荐
网页分析和一些基础题目
glut库更新旧程序无法完成编译问题描述
C专家编程 第10章 再论指针 10.6 使用指针从函数返回一个数组
易基因|深度综述:m6A RNA甲基化在大脑发育和疾病中的表观转录调控作用
LabView---双通道示波器(内含信号发生器)
清理空的 Jetpack Compose 应用程序模板
一文带你彻底拿下a,b两点间等效电阻
Gif动图如何快速制作?教你1分钟图片合成gif的方法
64位 RT-Thread 移植到 Cortex-A53 系统 bug 修复笔记
Gif动图怎么用视频做?一键在线完成视频转gif制作
一文带你拿下信号卷积—常见信号卷积
异常处理的超详细讲解
视频转gif怎样操作?1分钟在线视频转gif制作
【随笔】自己看的... 保存
openpyxl绘制堆叠图
剑指OfferⅡ 045.二叉树最底层最左边的值 dfs
不爱生活的段子手不是好设计师|ONES 人物
软件配置 | pip下载第三方库文件及配置pip源的不完全总结
FTXUI基础笔记(botton按钮组件进阶)
babylonjs shader