专栏首页秘籍酷C语言(枚举类型)

C语言(枚举类型)

C语言中的枚举类型常年跑龙套当配角,不受待见,这当然是有其个人原因的。今天来个小知识,看看枚举为什么那么衰,也顺便看看怎么用。

我们先来回忆一下为什么需要枚举,枚举究竟是个什么东东? 话说在很久很久以前,我们的祖先在编程的时候,发现只要整型就够了,于是发明了很多像int、short、long等的数据类型。

但后来慢慢发现,有些事物虽然也能使用整数来表征,但是显得不够严谨,比如彩虹的七色光:红橙黄绿蓝靛紫,我们当然可以使用一个int型数据的1~7来表达七种颜色。

现在考虑这样一种情形:如果我硬要给颜色变量赋值为8,那将会如何呢?答案是:语法上毫无问题,但逻辑上却毫无意义。8这个数值明明是无效的,但却不违反任何语义规定。这样的语义当然是有缺陷的,这个缺陷的病灶在于:整型数据的有效范围完全等价于取值范围,而无法由开发人员指定。

这就是枚举的诞生初衷:一种可以指定范围的整型,就以上面的彩虹颜色为例,用枚举来表达,应该是这么定义:

enum spectrum {red=1, orange, yellow, green, blue, indigo, purple}; enum spectrum color;

注意到上面两行代码,第一行是所谓的枚举类型定义及其常量列表,实际上就定义了枚举变量的有效范围,从red(即1)开始,到purple(即7),超过此范围的,对于枚举类型 enum spectrum 而言都是非法的,因此变量 color 的取值只能是red 到 purple。

color = blue; // 正确,此时color就是5 color = 5; // 错误,5是整型,而不是枚举 color = 8; // 错误,8是整型,而不是枚举,并且8不在效范围之内 color = red + orange; // 错误,枚举不能相加减

从以上几行代码看出来,枚举类型是为了达到两个目的:第一,限定有效范围。第二,使用单词而不是数字,提高程序的可读性。

这么看来,枚举是一种挺好玩也挺有用的东西,但是在C语言中怎么就不受待见了呢?原因是C语言只提供了一种阉割版的枚举,以上两大目的在C中实质上都是没有实现的,也就是说,在C语言中,实际情况是这样的:

color = blue; // 正确,此时color就是5 color = 5; // 正确,此时color就是blue color = 8; // 正确,8是整型,跟枚举完全没有任何区别 color = red + orange; // 正确,完全等价于 color = 1+2

你看明白了吧,C语言中的所谓枚举其实就是个坑爹货,其实就是彻头彻尾的整型数据而已。枚举的真正实现,在C++中才有实现。

本文分享自微信公众号 - 秘籍酷(mijiku040),作者:林世霖

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-05-08

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 嵌入式(破解rz)

    在我天朝,不能破解的软件还能叫软件吗?!神马?知识产权?我只知道没有城管掀不翻的小贩,也没有百度搜不到的注册码!

    用户2617681
  • C语言(跳转语句中的流氓)

    从上面的代码看到goto的语法很简单,就是直接跳转到指定的标签处,所谓的标签(如例子中的label)指的是后面带一个冒号的标识符。

    用户2617681
  • C语言(各种基本定义)

    数组指针即“指向某个数组的指针”,指针数组即“存放了一堆指针的数组”,函数指针即“指向某个函数的指针”,这些与其说是编程语法,不如说是小学语文。

    用户2617681
  • django rest framework mixins小结

    由上图可以看出这个类的一个逻辑,其中,perform_create( )对serializer直接进行save保存,当在一些情境下,我们需要对perform...

    程序员同行者
  • RESTful源码笔记之RESTful Framework的Mixins小结

    本篇对drf中的mixins进行简要的分析总结。 Mixins在drf中主要配合viewset共同使用,实现http方法与mixins的相关类与方法进行关联。

    Jetpropelledsnake21
  • Python查看对象或者方法使用帮助的三板斧

    python中每一个对象或者对象的方法都有可以使用三种方式查看相关的使用方法和帮助文档。

    有福
  • 机器学习之环境搭建

    读书的时候,很喜欢数学,然则,发现生活中很少用到稍微深点的数学知识,毕业后发现工作里真心也很少用到数学,因为算法都基本用不上。再也没有接触到数学。但是我知道数学...

    企鹅号小编
  • Hybris商品图片导入与压缩有关的配置

    1.   在电脑上安装 ImageMagick 软件(windows平台还需要安装VC++),下载路径:http://www.imagemagick.org/s...

    JMCui
  • 深入浅出Shiro系列——权限认证

    授权,也叫访问控制,即在应用中控制谁能访问哪些资源(如访问页面/编辑数据/页面操作等)。在授权中需了解的几个关键对象:主体(Subject)、资源(Resou ...

    用户7544680
  • 微信小程序开发-常见问题

    知晓程序员,专注微信小程序开发的程序员! 好久没写文章,今天总结一下小程序开发过程中遇到的问题,有不对的地方,欢迎各位指正~ 1、域名必须是HTTPS2、inp...

    企鹅号小编

扫码关注云+社区

领取腾讯云代金券