枚举子的类型和取值
默认下,第一个枚举子被赋值0,接下来的枚举子取值是前面一个枚举子的取值+1,例如:从这个例子也可以看出,同一枚举中枚举子的取值不需要唯一。
enum weather {sunny, cloudy, rainy, windy};
其中
sunny == 0,
cloudy == 1,
rainy == 2,
windy == 3;
以上是默认情况,有时候我们希望显式地指定某个枚举子的值,那么会出现什么情况呢?看看:
enum some_fruit {apple = 3, orange, banana = 4, bear};
好了,apple = 3, banana = 4; 那么orange和bear呢?记得前面说过一句,默认下”接下来的枚举子取值是前面一个枚举子的取值+1“。既然这两个枚举子没有显式赋值,那么就按照默认规则办事,所以 orange = 4, bear = 5.
枚举的取值范围
如果某个枚举中所有枚举子的值均非负整数,该枚举的表示范围就是[0:2^k-1],其中2^k是能使所有枚举子都位于此范围内的最小的2的幂;如果存在负的枚举值,该枚举的取值范围就是[-2^k,2^k-1].不能为浮点数。例如:enum e1 {dark, light}; //范围0:1enum e3 {min = -10, max = 1000}; //范围-1024:1023
枚举与整型的关系
枚举型可以自动转换成整数,但是不能整数自动转为枚举型
enum e1 {...};
enum e1=1;//错!
整型值只能显式地转换成一个枚举值,但是,如果转换的结果位于该枚举取值范围之外,则结果是无定义的。
enum e1 {dark = 1, light = 10};
e1 VAR1 = e1(50); //无定义
e1 VAR2 = e1(3); //编译通过
在这里也说明了不允许隐式地从整型转换到枚举的原因,因为大部分整型值在特定的枚举里没有对应的表示。
sizeof
该问题就是sizeof( EType1 )等于多少的问题,是不是每一个用户自定义的枚举类型都具有相同的尺寸呢?
在大多数的32位编译器下(如:VC++、gcc等)一个枚举类型的尺寸其实就是一个sizeof( int )的大小,难道枚举类型的尺寸真的就应该是int类型的尺寸吗?
其实不是这样的,在C++标准文档(ISO14882)中并没有这样来定义,
标准中是这样说明的:“枚举类型的尺寸是以能够容纳最大枚举子的值的整数的尺寸”,
同时标准中也说名了:“枚举类型中的枚举子的值必须要能够用一个int类型表述”,
也就是说,枚举类型的尺寸不能够超过int类型的尺寸,但是是不是必须和int类型具有相同的尺寸呢?
上面的标准已经说得很清楚了,只要能够容纳最大的枚举子的值的整数就可以了,那么就是说可以是char、short和int。
因此有的编译器sizeof为4 有的为1