首页 > 编程知识 正文

c语言中枚举类型是什么意思,c语言enum是什么意思

时间:2023-05-05 22:54:24 阅读:126897 作者:1282

枚举

enum是c语言的关键字。 枚举数据类型称为枚举数据类型,枚举数据类型描述整数值的集合。 (这句话实际上不太妥当。 枚举类型是预处理指令#define的替代,枚举与宏非常相似。 宏在预处理阶段用相应的值替换名称,枚举在编译阶段用相应的值替换名称。

枚举可以理解为编译阶段的宏,使用格式。

枚举类型名称{ value name 1,valueName2,valueName3,…};

typeName是枚举类型的名称,大括号中的元素(枚举成员)是常量而不是变量。 这个请一定要弄清楚。 枚举成员的是常量,因此不能为它们赋值。 只能分配给其他变量

枚举类型(枚举标签)、枚举成员(枚举常量)、枚举变量的差异

如果枚举类型和枚举变量定义在一起,则可以不写枚举类型的名称(枚举week中的week )。 上图的意思是有两种写法

第一个:

enum week{Mon=1,Tues,Wed,Thurs}num;

第二个:

enum {Mon=1,Tues,Wed,Thurs}num;

这其实和结构体中的无名结构很相似。 定义枚举类型变量和定义结构类型变量看起来很相似,但两者之间的差异很大。 一个结构型变量包含多个成员,相当于打包的快递箱。

另一方面,枚举类型变量是不同的。 枚举类型变量不是包含几个成员的集合。 枚举类型变量与int和char类型的变量实际上相同。 但是,枚举类型变量的赋值只能在自己的枚举成员中赋值。 用上述例子来说,

num赋值只能使用枚举成员Mon、Tues、Wed和Thurs,不能为其他枚举类型的枚举成员赋值

枚举变量的定义与结构变量的定义相同,有两种定义方法

第一个是()定义枚举类型的同时定义枚举变量) ) )。

enum week{Mon=1,Tues,Wed,Thurs}num;

第二()定义枚举类型,然后定义枚举变量) )。

enum week{Mon=1,Tues,Wed,Thurs}; enum week num;

枚举类型的特征

用另一个例子说明枚举类型的特征

例1:((不明确说明枚举常量的值) ) ) ) ) ) ) )。

enum week{Mon,Tues,Wed,Thurs,Fri,Sat,Sun};

如果未显示说明,则枚举常量(即大括号中的常量名称)默认情况下第一个枚举常量的值为0,然后为每个枚举常量递增1,因此请尝试使用Mon=0、Tues=1,Sun=6进行验证

enumweek{Mon,Tues,Wed,Thurs,Fri,Sat,Sun};

printf (mon=% dNTU es=% dnwed=% dnthu RS=% dnfri=% dnsat=% dnsun=% dn ',mon,Tues

执行结果:

例2:(显示说明部分列举常数的值) ) ) ) )。

enum week{Mon=1,Tues,Wed,Thurs,Fri,Sat,Sun};

上面的代码只明确显示枚举常量Mon的值为1,未指定的枚举名称的值从最后指定的值向后依次递增。 请注意,这是最后指定的值

enum week{Mon=1,Tues,Wed,Thurs,Fri,Sat,Sun};

printf (mon=% dNTU es=% dnwed=% dnthu RS=% dnfri=% dnsat=% dnsun=% dn ',mon,Tues

执行结果:

对上面的代码进行一点修改

enum week{Mon=1,Tues,Wed,Thurs,Fri=10,Sat,Sun};

printf (mon=% dNTU es=% dnwed=% dnthu RS=% dnfri=% dnsat=% dnsun=% dn ',mon,Tues

执行结果:

例3:(赋值给枚举变量) ) ) ) )。

enum week{Mon=1,Tues,Wed,Thurs}num;

num=(enumweek ) 10;

printf('%d ',num );

整数不能直接分配给枚举变量。 必须先按枚举变量所属的枚举类型进行类型强制转换,然后再赋值。 在上面的代码中,将10赋值给枚举变量时发生的强制类型转换在赋值之前将整数常量10转换为枚举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),两者效果是一样的

补充:对上面总结的第五点:同一个程序中不能定义同名的枚举类型,不同的枚举类型中也不能存在同名的枚举成员(枚举常量),进行验证

enumm1{m1, m2};enumm2{m3, m4};enum m1{m5, m6};

上述代码定义的枚举类型enum m1多次定义,是不允许的,编译器会报错

还有一种特殊情况,即使定义了同名的枚举类型,编译器也不会报错

enumm1{m1, m2};enumm2{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("%dn%dn", m1, INT_MAX);

运行结果:

上面的代码没有问题,下面来测试一下越界的赋值

enum test{m1=INT_MAX+1};

printf("%dn%dn", m1, INT_MAX);

编译器在编译阶段会有警告

,测试了枚举类型的最大值,下面来测试下枚举类型的最小值

enum test{m1=INT_MIN};

printf("%dn%dn", m1, INT_MIN);

运行结果:

上面的代码没有问题,下面来测试一下越界的赋值

enum test{m1=INT_MIN-1};

printf("%dn%dn", m1, INT_MIN);

和上面相同,编译器也会有警告

为什么“枚举类型描述的是一组整型值的集合”其实不太妥当?

上面这句话很容易让读者以为enum类型和int类型是等价的,好像可以把int型的数据直接赋值给enum变量,实际上是不行的,需要进行强制类型转换,C语言提供了一种称为“枚举”的类型,其中一个枚举常量的占的字节数为4个字节,恰好和int类型的变量占的字节数相同,假设把这些枚举常量说明为整型,字符型或其他类型显然是不妥当的,因为枚举类型是一种基本数据类型,而不是一种构造类型,它不能再分解为什么基本类型。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。