社区导航

 
快捷导航
  • 首页
  • 论坛
  • 查看新帖
  • 最新回复
  • 社区活动
  • 联系管理员
  • 消灭零回复
  • E金币兑换
  • 干货
搜索
查看: 604|回复: 13

[讨论] 【C基础语法细谈】之 enum是个什么鬼

[复制链接]

7246

TA的帖子

48

TA的资源

版主

Rank: 6Rank: 6

发表于 2017-10-10 20:32:29 | 显示全部楼层 |阅读模式
刚才翻着分版块里的帖子,发现除了已经被我回复过的和我新造的孽,也没什么帖子,在寂寞空虚冷之际,发现了 女神斑斑 发的一个帖子
[讨论] 水军课堂:关于枚举类型的那些事儿

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


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

来来来,我来开个头。


此帖出自编程基础论坛
没有一件事情是容易的,所以,起念头时,一定要好好琢磨

回复

使用道具 举报

7246

TA的帖子

48

TA的资源

版主

Rank: 6Rank: 6

 楼主| 发表于 2017-10-10 20:34:42 | 显示全部楼层
本帖最后由 辛昕 于 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

到底有没有区别?
如果有区别,最大的区别在哪里?(用代码证明)

点评

枚举是一个整型常数的集合。被定义的枚举变量一定是这个集合的成员。模拟现实生活中的许多事情,比如班里的学生,一个星期的七天,公司的员工等等,如果超出这个范围给枚举赋值就无效。 #define是一个常量定义,  详情 回复 发表于 2017-10-12 14:05
例子: 用#define 写出来估计  详情 回复 发表于 2017-10-12 11:21
没有一件事情是容易的,所以,起念头时,一定要好好琢磨

回复

使用道具 举报

7246

TA的帖子

48

TA的资源

版主

Rank: 6Rank: 6

 楼主| 发表于 2017-10-10 20:36:53 | 显示全部楼层
本帖最后由 辛昕 于 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;
又该如何呢?

是的,这是一个提示。
没有一件事情是容易的,所以,起念头时,一定要好好琢磨

回复

使用道具 举报

7246

TA的帖子

48

TA的资源

版主

Rank: 6Rank: 6

 楼主| 发表于 2017-10-10 20:39:57 | 显示全部楼层
第三个问题,也是大多数人很习惯的看法:
在女神总结的帖子里,最开始就出现了这样的说法:

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


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

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

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

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

[C] 纯文本查看 复制代码
enum xx
{
     AA = 9,
     BB = 3,
     CC = 5,
     DD = 3,
}
没有一件事情是容易的,所以,起念头时,一定要好好琢磨

回复

使用道具 举报

7246

TA的帖子

48

TA的资源

版主

Rank: 6Rank: 6

 楼主| 发表于 2017-10-10 20:40:35 | 显示全部楼层
好了,最后一个问题,今晚的最后一个问题。
联系前面几个问题,有一个 开放性问题:

你认为,枚举 这个东西,是拿来干嘛的?
没有一件事情是容易的,所以,起念头时,一定要好好琢磨

回复

使用道具 举报

2313

TA的帖子

8

TA的资源

版主

Rank: 6Rank: 6

发表于 2017-10-11 16:31:23 | 显示全部楼层
枚举C语言时没有学过,老师还没有教到一学期就结束了。猜一下,就是穷举的意思,他存的意义就是提高程序的复用度。用数组要求类型一样,用集合又没有顺序。以上观点纯来自个人随口说的,说错很指出,见谅!

点评

意义这个东西太虚。 讨论这种跟实际应用没几毛钱的东西时。 一般也就剩下两种路数了。 一,看ansi系列C标准,但那有点像老学究或者对簿公堂——反正我没兴趣。 二,厘清一些实际中的问题。 我倾向第二种,  详情 回复 发表于 2017-10-11 23:30

回复

使用道具 举报

7246

TA的帖子

48

TA的资源

版主

Rank: 6Rank: 6

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

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

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

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

所以,请回答问题~~

点评

实际问题中我没有用到过……业余玩玩,很少用到高级点功能,就在各种厂家的sdk里面看到过,但用处嘛,基本上就是前面所说的提高复用度的问题,作为函数的参数,这样简化了函数的参数。  详情 回复 发表于 2017-10-12 09:27
没有一件事情是容易的,所以,起念头时,一定要好好琢磨

回复

使用道具 举报

2313

TA的帖子

8

TA的资源

版主

Rank: 6Rank: 6

发表于 2017-10-12 09:27:31 | 显示全部楼层
辛昕 发表于 2017-10-11 23:30
意义这个东西太虚。
讨论这种跟实际应用没几毛钱的东西时。
一般也就剩下两种路数了。

一,看ansi系 ...

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

点评

俺是说..... 回答我前面提到的问题...... 我知道你们不知道从何说起的,所以我才砸问题开路啊~  详情 回复 发表于 2017-10-12 10:15

回复

使用道具 举报

7246

TA的帖子

48

TA的资源

版主

Rank: 6Rank: 6

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

俺是说.....
回答我前面提到的问题......
我知道你们不知道从何说起的,所以我才砸问题开路啊~
没有一件事情是容易的,所以,起念头时,一定要好好琢磨

回复

使用道具 举报

2313

TA的帖子

8

TA的资源

版主

Rank: 6Rank: 6

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

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

例子:
[C] 纯文本查看 复制代码
enum xx
{
     AA,
     BB,
     CC,
     DD,
}
XX a[4];
int checkXX(enum XX)
{
   swich(XX){     
      }
}


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

点评

赞一个,聪明。 其实这个还有一个更简单的方法 (AA++)*(A++)  详情 回复 发表于 2017-10-12 12:01

回复

使用道具 举报

7246

TA的帖子

48

TA的资源

版主

Rank: 6Rank: 6

 楼主| 发表于 2017-10-12 12:01:48 | 显示全部楼层
strong161 发表于 2017-10-12 11:21
例子:
[mw_shl_code=c,true]enum xx
{
     AA,
     BB,
     CC,
     DD,
}
XX a[4];
int c ...

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

(AA++)*(A++)
没有一件事情是容易的,所以,起念头时,一定要好好琢磨

回复

使用道具 举报

2439

TA的帖子

0

TA的资源

版主

Rank: 6Rank: 6

测评达人

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

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

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

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




回复

使用道具 举报

68

TA的帖子

0

TA的资源

版主

Rank: 6Rank: 6

发表于 2017-10-12 15:45:02 | 显示全部楼层
发现我特爱凑辛版的热闹,嘿嘿,显摆一下---为了显摆,纯凭记忆,不百度不翻书
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%,也是一个巨大的改进了。从结构化到面向对象,意义都是如此。

点评

好认真的回答。 回头,等我焚香沐浴更衣,再来认真看你的回答。  详情 回复 发表于 7 天前

评分

1

查看全部评分


回复

使用道具 举报

7246

TA的帖子

48

TA的资源

版主

Rank: 6Rank: 6

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

好认真的回答。
回头,等我焚香沐浴更衣,再来认真看你的回答。
没有一件事情是容易的,所以,起念头时,一定要好好琢磨

回复

使用道具 举报

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

本版积分规则

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

小黑屋|手机版|Archiver|电子工程世界 ( 京ICP证 060456

GMT+8, 2017-10-23 06:32 , Processed in 0.415164 second(s), 16 queries , Redis On.

快速回复 返回顶部 返回列表