4551|19

7815

帖子

57

TA的资源

裸片初长成(中级)

楼主
 

【C基础语法细谈】之 enum是个什么鬼 [复制链接]

 
刚才翻着分版块里的帖子,发现除了已经被我回复过的和我新造的孽,也没什么帖子,在寂寞空虚冷之际,发现了 女神斑斑 发的一个帖子
[讨论] 水军课堂:关于枚举类型的那些事儿

说实话,太久没混水军群了,所以不知道那天究竟发生了什么事,不过看着女神总结得那么辛苦,心疼,下次你们能不能挑重点的说......


说起enum这个东西,是个看起来很简单,但说起来总有种怪怪的感觉的东西。

来来来,我来开个头。


此帖出自编程基础论坛

最新回复

LZ,节日快乐  详情 回复 发表于 2017-12-22 16:52
点赞 关注(1)
个人签名

强者为尊,弱者,死无葬身之地

 

回复
举报

7815

帖子

57

TA的资源

裸片初长成(中级)

沙发
 
本帖最后由 辛昕 于 2017-10-10 20:41 编辑

下次再去细究那个帖子,先来说说我觉得感觉怪怪会所不清楚的地方。

第一个问题是:
enum到底是一次 重定义结构,也就是类似于typedef,还是别的什么鬼?

enum xx
{
     AA,
     BB,
     CC,
     DD,
}


#define AA 0
#define BB 1
#define CC 2
#define DD 3

到底有没有区别?
如果有区别,最大的区别在哪里?(用代码证明)
此帖出自编程基础论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

7815

帖子

57

TA的资源

裸片初长成(中级)

板凳
 
本帖最后由 辛昕 于 2017-10-10 20:42 编辑

问题2:
大多数人都认为,enum定义了一种 枚举型数据变量。
可是,举个栗子:

如果我们定义了

enum xx
{
     AA,
     BB,
     CC,
     DD,
}

然后,我们定义

static xx s_var = AA;

请问,这个xx类型,和 直接随便来一个 int 或者 char 能有多大区别?
我知道这个问法,大多数人会不知道怎么回事?
所以我把问题细化到

这里面有什么区别,可以从 编写、阅读代码 和 代码运行过程中 来分别谈谈。

小提示,如果我直接
static xx s_var = 9;
或者
static xx s_var = 1;
又该如何呢?

是的,这是一个提示。
此帖出自编程基础论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

7815

帖子

57

TA的资源

裸片初长成(中级)

4
 
第三个问题,也是大多数人很习惯的看法:
在女神总结的帖子里,最开始就出现了这样的说法:

  1. A:枚举不会改变的吧,里面的值是常量了,你要修改得在里面修改
  2. 1号:枚举定义好之后,不能改变里面的值了?
  3. A:好像是递增,你取了第一个的值,下面的值都是递增了
复制代码


第一句,先不管。
注意第二句:
所谓 定义好之后,就不能改变,这是个什么意思呢?
是说 xx的取值范围不能改变了,还是说xx是不可以被赋值成其他值的呢?

重要提示:这个问题的思考,对第一个第二个问题有启发性作用。

我们来看第三句话。
取好第一个值,以后就递增。

这已经是比起 不管第一个值,默认为0的一个进步。
但是,还不够。
如果你不信,我给一个定义,你可以试试,看如何。

  1. enum xx
  2. {
  3.      AA = 9,
  4.      BB = 3,
  5.      CC = 5,
  6.      DD = 3,
  7. }
复制代码
此帖出自编程基础论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

7815

帖子

57

TA的资源

裸片初长成(中级)

5
 
好了,最后一个问题,今晚的最后一个问题。
联系前面几个问题,有一个 开放性问题:

你认为,枚举 这个东西,是拿来干嘛的?
此帖出自编程基础论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

2774

帖子

8

TA的资源

版主

6
 
枚举C语言时没有学过,老师还没有教到一学期就结束了。猜一下,就是穷举的意思,他存的意义就是提高程序的复用度。用数组要求类型一样,用集合又没有顺序。以上观点纯来自个人随口说的,说错很指出,见谅!
此帖出自编程基础论坛
 
 
 

回复

7815

帖子

57

TA的资源

裸片初长成(中级)

7
 
strong161 发表于 2017-10-11 16:31
枚举C语言时没有学过,老师还没有教到一学期就结束了。猜一下,就是穷举的意思,他存的意义就是提高程序的 ...

意义这个东西太虚。
讨论这种跟实际应用没几毛钱的东西时。
一般也就剩下两种路数了。

一,看ansi系列C标准,但那有点像老学究或者对簿公堂——反正我没兴趣。
二,厘清一些实际中的问题。

我倾向第二种,因为有那么点意义,又有点趣味。

所以,请回答问题~~
此帖出自编程基础论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

2774

帖子

8

TA的资源

版主

8
 
辛昕 发表于 2017-10-11 23:30
意义这个东西太虚。
讨论这种跟实际应用没几毛钱的东西时。
一般也就剩下两种路数了。

一,看ansi系 ...

实际问题中我没有用到过……业余玩玩,很少用到高级点功能,就在各种厂家的sdk里面看到过,但用处嘛,基本上就是前面所说的提高复用度的问题,作为函数的参数,这样简化了函数的参数。
此帖出自编程基础论坛
 
 
 

回复

7815

帖子

57

TA的资源

裸片初长成(中级)

9
 
strong161 发表于 2017-10-12 09:27
实际问题中我没有用到过……业余玩玩,很少用到高级点功能,就在各种厂家的sdk里面看到过, ...

俺是说.....
回答我前面提到的问题......
我知道你们不知道从何说起的,所以我才砸问题开路啊~
此帖出自编程基础论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

2774

帖子

8

TA的资源

版主

10
 
本帖最后由 strong161 于 2017-10-12 11:23 编辑
辛昕 发表于 2017-10-10 20:34
下次再去细究那个帖子,先来说说我觉得感觉怪怪会所不清楚的地方。

第一个问题是:
enum到底是一次 重 ...

例子:
  1. enum xx
  2. {
  3.      AA,
  4.      BB,
  5.      CC,
  6.      DD,
  7. }
  8. XX a[4];
  9. int checkXX(enum XX)
  10. {
  11.    swich(XX){     
  12.       }
  13. }

复制代码

用#define 写出来估计尴尬吧!  两者的区别 很明显,枚举中 AA是实体, 在本例中未给值 应该等于 0,而这个0的只是用一个值或是序号来代替 AA,方便计算机计算用,而#define是相反的,他实质上是0,只是用AA来代替 0,方便的是用户编程与阅读用。
此帖出自编程基础论坛
 
 
 

回复

7815

帖子

57

TA的资源

裸片初长成(中级)

11
 
strong161 发表于 2017-10-12 11:21
例子:
[code]enum xx
{
     AA,
     BB,
     CC,
     DD,
}
XX a[4];
int c ...

赞一个,聪明。
其实这个还有一个更简单的方法

(AA++)*(A++)
此帖出自编程基础论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

6105

帖子

4

TA的资源

版主

12
 
本帖最后由 damiaa 于 2017-10-12 14:06 编辑
辛昕 发表于 2017-10-10 20:34
下次再去细究那个帖子,先来说说我觉得感觉怪怪会所不清楚的地方。

第一个问题是:
enum到底是一次 重 ...

枚举是一个整型常数的集合。被定义的枚举变量一定是这个集合的成员。模拟现实生活中的许多事情,比如班里的学生,一个星期的七天,公司的员工等等,如果超出这个范围给枚举赋值就无效。

#define是一个常量定义,方便查看或表达式或者书写。



此帖出自编程基础论坛
 
 
 

回复

116

帖子

0

TA的资源

版主

13
 
发现我特爱凑辛版的热闹,嘿嘿,显摆一下---为了显摆,纯凭记忆,不百度不翻书
1,技术细节
enum xx
{
     AA,
     BB

默认AA=0,但是默认值可以在定义中改,如
enum xx
{
     AA=3,
     BB}
则 BB=4
enum xx
{
     AA,
     BB=4

则AA=0(因为缺省是0)
另,楼主4楼的定义没问题,不知道会不会有警告,因为两个枚举变量值相等,但是应该没有error。实际编程中如果有特殊理由的话,比如一个东西两个别名,用哪个都可以,那么这么用是没问题的。

2,以上称为“define”,而static xx s_var = 9; 这一句称为“declaration”这里要报error,因为只有define的时候可以指定具体数值,这一点是在编译器控制的。

3,这东西在内部就是作为整型来处理,int8或者int16之类的。可以用类型转换互相转。比如
static xx s_var=(xx)3; 是没问题的。因为3在之前定义过(假如xx.AA=3),如果没有任何一个等于3,应该也不会报错,但是运行中会发生“不可预料的错误”
这一条指的是单片机之类的“低档”编译器。如果是微软的Visual studio,检查就要严格的多,估计语法报错

4,意义。
俺当年考程序员的时候,有门课叫做“软件工程”,现在。。。发展成一个专业了。这门学问讲的就是如何多人配合做大大大大程序。做大大大大程序一个基础的要点就是封装。这个枚举和define比起来的意义,主要就是封装,枚举、结构体、数组这些工具提供了最简单最基本的第一层封装,实现的目标是结构化程序设计。
第二层是类的概念,实现面向对象的程序设计。
其实可以类比一下,比如对每个用户定义一个struct,描述年龄,性别等等,也完全可以拆散,单独定义里面的年龄作为一个变量,性别作为另外一个变量。为什么要发明struct这种东西呢?又能节省多少工作量呢(看起来方便、整洁?)这样的疑问对小程序是成立的,确实方便不到哪去,但是对于数万数十万行的大程序,无数的头绪,像是一团乱麻,如果能把头绪减少10%,也是一个巨大的改进了。从结构化到面向对象,意义都是如此。
此帖出自编程基础论坛

赞赏

1

查看全部赞赏

 
 
 

回复

7815

帖子

57

TA的资源

裸片初长成(中级)

14
 
风过琴弦 发表于 2017-10-12 15:45
发现我特爱凑辛版的热闹,嘿嘿,显摆一下---为了显摆,纯凭记忆,不百度不翻书
1,技术细节
enum xx
{
...

好认真的回答。
回头,等我焚香沐浴更衣,再来认真看你的回答。
此帖出自编程基础论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

366

帖子

1

TA的资源

一粒金砂(高级)

15
 
辛昕 发表于 2017-10-10 20:36
问题2:
大多数人都认为,enum定义了一种 枚举型数据变量。
可是,举个栗子:

如果我们定义了

enum ...

枚举型变量的取值范围受到了限制,只能取定义的枚举范围内的值,范围之外是不允许的。我记得STM32库文件中,就用了好多的枚举,初始化寄存器时,如果用枚举型变量来给寄存器赋值,至少保证不会出现手册中未定义的值。
此帖出自编程基础论坛
 
 
 

回复

366

帖子

1

TA的资源

一粒金砂(高级)

16
 
辛昕 发表于 2017-10-10 20:40
好了,最后一个问题,今晚的最后一个问题。
联系前面几个问题,有一个 开放性问题:

你认为,枚举 这个 ...

可以用来减少非法赋值。接口传递数据的时候,把要往某个接口写的参数枚举,然后定义一个枚举型变量,传参的时候就强制转换成这个枚举型的变量,数据超过范围的话就会报错
此帖出自编程基础论坛
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

17
 
我能说到现在也没看明白这个枚举干嘛用的,举几个使用实例说明不是更好。如果枚举里就是一些序列数那真实的用处是什么?小白学了二天C来瞎问的。
此帖出自编程基础论坛
 
 
 

回复

7815

帖子

57

TA的资源

裸片初长成(中级)

18
 
xxldhxx 发表于 2017-11-19 18:36
我能说到现在也没看明白这个枚举干嘛用的,举几个使用实例说明不是更好。如果枚举里就是一些序列数那真实的 ...

其实从我的角度来看,
enum是这么一个东西:
其实还真的没啥卵用,除了给人看。
问题是,即使有人不遵守,好像也不会出什么大不了的事情。
此帖出自编程基础论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

7815

帖子

57

TA的资源

裸片初长成(中级)

19
 
xxldhxx 发表于 2017-11-19 18:36
我能说到现在也没看明白这个枚举干嘛用的,举几个使用实例说明不是更好。如果枚举里就是一些序列数那真实的 ...

当然,我希望认真挖掘其中的一些东西。
但是,坑开得有点多,我还没来得及收拾。
此帖出自编程基础论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

257

帖子

0

TA的资源

一粒金砂(高级)

20
 
LZ,节日快乐
此帖出自编程基础论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表