enum week{Mon = 1, Tues, Wed, Thurs}num; num = (enum week)10; printf("%d", num);
一个整数不能直接赋值给一个枚举变量,必须用该枚举变量所属的枚举类型进行类型强制转换后才能赋值,上面的代码中,在对枚举变量赋值10的时候进行的强制类型转换,将整型常量10转换成了enum week类型再赋值给num变量,
运行结果:
总结:
1、在没有显示说明的情况下,枚举常量(也就是花括号中的常量名)默认第一个枚举常量的值为0,往后每个枚举常量依次递增1
2、在部分显示说明的情况下,未指定的枚举名的值将依着之前最有一个指定值向后依次递增
3、一个整数不能直接赋值给一个枚举变量,必须用该枚举变量所属的枚举类型进行类型强制转换后才能赋值
4、同一枚举类型中不同的枚举成员可以具有相同的值
5、同一个程序中不能定义同名的枚��类型,不同的枚举类型中也不能存在同名的枚举成员(枚举常量)
enum与typedef配合使用typedef enum week my;
或者
typedef enum week{Mon = 1, Tues, Wed, Thurs}my;
上面typedef也可以省略week
typedef enum{Mon = 1, Tues, Wed, Thurs}my;
上面两种形式中,my都是enum week的别名(意思是my和enum week等价),需要注意的是如果将第二句的typedef去掉那么my就变成了enum week类型的变量,如果加上typedef那么my就是enum的别名,这点要注意区分
在定义了enum week的别名my后,后面就可以使用my来定义枚举类型变量
my num; num = (enum week)10; printf("%d", num);
上述语句中的(enum week),可以改为(my),两者效果是一样的
补充:对上面总结的第五点:同一个程序中不能定义同名的枚举类型,不同的枚举类型中也不能存在同名的枚举成员(枚举常量),进行验证
enum m1{m1, m2}; enum m2{m3, m4}; enum m1{m5, m6};
上述代码定义的枚举类型enum m1多次定义,是不允许的,编译器会报错还有一种特殊情况,即使定义了同名的枚举类型,编译器也不会报错
enum m1{m1, m2}; enum m2{m3, m4}; enum m1;
上面的代码中,第二个enum m1没有定义枚举成员,在编译阶段是不会报错的(估计是编译器并不认为定义了枚举成员的enum m1 和 没有定义枚举成员的enum m1是同名的枚举类型)
enum的赋值范围
这个也是无意间注意到的,文章在开头提到枚举类型描述的是一组整型值的集合,枚举类型的占的字节数是4个字节,所以我们可以用INT_MAX和INT_MIN来测试枚举类型的赋值范围,赋值的最大值应该是INT_MAX(也就是2147483647),下面用代码来测试一下
enum test{m1=INT_MAX}; printf("%d\n%d\n", m1, INT_MAX);
运行结果:
上面的代码没有问题,下面来测试一下越界的赋值
enum test{m1=INT_MAX+1}; printf("%d\n%d\n", m1, INT_MAX);