注册 登录
编程论坛 C++教室

枚举的取值范围

蚕头燕尾 发布于 2013-08-06 09:44, 977 次点击
书上说可以在范围内进行强制类型转换(int强转为enum)

大家经常这么用吗?

这种,举个例子说:

我这样定义了之后,enum bits{one=1,two=2,four=4,eight=8};

再这样用:

bits myflag;

myflag=bits(6);

像是下面这种用法一般有什么用处?

15 回复
#2
rjsp2013-08-06 09:48
可以,记得限定语“在范围内
以你定义的这个bits为例,其范围为0到15,也就是bits(15)是可以的,而bits(16)是未定义行为。
#3
peach54602013-08-06 10:20
像是下面这种用法一般有什么用处?

你这下面是两个兔子,没有什么用法
#4
蚕头燕尾2013-08-06 11:51
peach版主说话好逗

我的意思是:

我这样设定之后的那个的下面


也就是指这里:
bits myflag;

myflag=bits(6);
#5
rjsp2013-08-06 12:05
回复 4楼 蚕头燕尾
那应该改
像是下面这种用法一般有什么用处?

像是面这种用法一般有什么用处?
#6
peach54602013-08-06 12:26
哦,这种用法没什么深意,就是看代码好理解一点
比如说
你知道什么叫magic number不?

再就是枚举和int还是两种类型,编译器不会自动转型,需要强转一下
#7
蚕头燕尾2013-08-06 12:51
嗯嗯,上面算是我表达不清

peach版主说的magic number是想说魔方数吗?

但我没能理解你举这个例子是想说明什么意思?

感觉自己语言表达能力好差呀,

我是想问这样的问题:

myflag=bits(6);
这样做虽然是允许的,但是像是这里myflag这样的变量在什么场合下回用到?

就我现在的水平,感觉这么做毫无意义啊?

#8
peach54602013-08-06 13:36
http://baike.baidu.com/view/1922945.htm#2
太长了,自己去看
第一部分不关心
看魔数在程序开发中的意义...

替代魔数,基本上不是宏定义就是枚举或者就是const变量...
#9
蚕头燕尾2013-08-06 13:59
我想应该还是我的问题,我还是没有表达清楚,啊啊啊,,说话真费劲啊

我不是问枚举的用处,我是想问:把一个int强制转换成 “定义这个枚举类型的时候,

列表中没有提到一个值” 有什么用处。

比如我上面枚举定义时候的那个列表里没有值为6的。

但我下面一点要把6转换成枚举类型。

这么做有什么意义?
#10
peach54602013-08-06 14:19
没意义
#11
蚕头燕尾2013-08-06 16:56
好吧。

#12
TonyDeng2013-08-09 12:17
回复 楼主 蚕头燕尾
不要这样用!
#13
蚕头燕尾2013-08-09 13:22
回复 12楼 TonyDeng
哦哦,可是这到底有什么坏处吗?

#14
TonyDeng2013-08-09 13:44
枚举,是列举的意思,即区别每一个个体,尽管这(被枚举出来的)一系列个体是同一类别的性质,但个体之间有差异,其差异就用不同的数值区别出来,这个用于区别的数值类型其实是任意的,既可以是整数,也可以是浮点数,但重点是互相之间能夠区别,所以最佳的数据类型是使用整数。区别值用整数,不等于枚举中的每个元素就是整数,这是逻辑上的问题,对枚举来说,每个元素的区别值具体是什么,其实是不相干的,你设定one=1、two=2,实际上也可以设定one=2、two=10,只要one和two是不同的元素、而且它们的排序结果与需要吻合(one在two的前面),那些元素值就可以是任意的。现在,你应该明白了,当把1视为one的时候,你就是错的,在逻辑上1并不是one,one就是one,不是别的什么,可以视one为1,但1不必然是one。

正如上述,枚举只是列举,必然是有限集合,你定义中列明了集合中的具体元素,就只有那些,没有别的。1楼的代码,枚举集合中没有值为6的元素,编译可以通过,运行的结果myflag的值也为6,但是这个值并不是bits枚举集合中的,仅仅是一个整数罢了,在理论上,编译器不该让这种代码通过,能让这种代码通过是语言和编译器的缺陷。依据你的设想,six才是6,我们只能使用myflag = six这样的语句。不管是硬编码还是暗藏用法,所有使用枚举内部值的方式都是误用枚举。在C#中,枚举的机制比C/C++完善得多,在那里,输出one的结果是one字样,而不是内部编码值1。

[ 本帖最后由 TonyDeng 于 2013-8-9 13:51 编辑 ]
#15
TonyDeng2013-08-09 13:49
ASCII编码和各种字符编码,其实就是枚举性质。
#16
蚕头燕尾2013-08-10 13:59
回复 15楼 TonyDeng
嗯嗯,长知识啦~~

谢谢版主~~

1