枚举类型enum详解

文章详细介绍了C语言中的枚举数据类型enum,包括其本质、用途、格式以及与宏的区别。枚举是一种用户自定义的整型常量集合,枚举变量的大小通常等同于int类型。在没有显示指定值时,枚举常量会从0开始自动递增。同时,文章强调了不能直接将整型值赋给枚举变量,需要类型转换,并且枚举类型和枚举成员在命名上的限制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

概述

enum是C语言中的一个关键字,enum叫枚举数据类型,枚举数据类型描述的是一组整型值的集合(这句话其实不太妥当),因为枚举类型是一种基本数据类型,而不是一种构造类型,它不能再分解成什么基本类型。

好像可以把int型的数据直接赋值给enum变量,实际上是不行的,需要进行强制类型转换,C语言提供了一种称为“枚举”的类型,其中一个枚举常量的占的字节数为4个字节,恰好和int类型的变量占的字节数相同,假设把这些枚举常量说明为整型,字符型或其他类型显然是不妥当的。

枚举型是预处理指令#define的替代,枚举和宏其实非常类似,宏在预处理阶段将名字替换成对应的值,枚举在编译阶段将名字替换成对应的值,

格式

我们可以将枚举理解为编译阶段的宏,使用格式:

enum typeName{ valueName1, valueName2, valueName3, ...... };

typeName是枚举类型的名字,花括号里面的元素(枚举成员)是常量而不是变量,这个一定要搞清楚,因为枚举成员的是常量,所以不能对它们赋值,只能将它们的值赋给其他的变量。

枚举类型(枚举标签)、枚举成员(枚举常量)、枚举变量
在这里插入图片描述

当枚举类型和枚举变量放在一起定义时,枚举类型的名字(就是enum week中的week)可以省略不写

这一点其实和结构体中的无名结构很相似,虽然定义枚举类型变量和定义结构类型变量看起来很相似,但是两者的区别还是蛮大的,一个结构体类型变量里面包含若干个成员,相当于一个打包好的快递盒子,

而枚举类型变量就不一样了,枚举类型变量不是一个包含若干个成员的集合,枚举类型变量和int、char类型的变量其实差不多,只不过枚举类型变量的赋值只能用自身的枚举成员来赋值,以上面的例子来说,

num的赋值就只能用枚举成员Mon、Tues、Wed、Thurs,而不能用其他枚举类型的枚举成员来赋值。

枚举的大小

既然,struct结构体变量大小等于结构体中的各个成员变量所占内存大小总和,union共用体变量大小等于共用体结构中占用内存最大的成员的内存大小。

那么enum枚举变量所占内存大小怎么计算?

首先先明白概念:

数据类型,指固定内存大小的别名,如int类型为4个字节内存。

变量,一段连续存储空间的别名。这段连续存储空间的大小,即变量的大小,由定义该变量的数据类型决定,即该数据类型代表的固定内存大小。数据类型,是变量的模板。

应用到枚举上:

枚举类型,指一个被命名的整型常数的集合。即枚举类型,本质上是一组常数的集合体,只是这些常数有各自的命名。枚举类型,是一种用户自定义数据类型。

枚举变量,由枚举类型定义的变量。枚举变量的大小,即枚举类型所占内存的大小。由于枚举变量的赋值,一次只能存放枚举结构中的某个常数。所以枚举变量的大小,实质是常数所占内存空间的大小常数为int类型,当前主流的编译器中一般是32位机器和64位机器中int型都是4个字节),枚举类型所占内存大小也是这样。

另外,可以用编译器内置的指示符sizeof,计算出枚举变量(或枚举类型)的大小进行验证。


例子:

  int main() 

  { 

	  enum number { 
	
		  one = 1, 
		
		  two = 2, 
		
		  three = 3, 
		
		  foure = 4, 
	
	  }; 

  enum number num1; 
 
 
 

  printf("int sizeof:%d\n",sizeof(int)); 
  
 //int类型占用几个字节; 

  printf("enum number sizeof:%d\n",sizeof(enum number)); 
  
 //枚举结构  enum number占用几个字节; 

  printf(" variable num1 sizeof:%d\n",sizeof(num1)); 
  
 //定义后的枚举变量占用几个字节; 
 
 
 

  num1 = three; 

  printf("after 'num1 = three' ,variable num1 sizeof:%d\n",sizeof(num1)); 
  
 //赋值后的枚举变量占用几个字节; 

  } 

结果打印:
在这里插入图片描述

定义

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

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

特点

enum week{Mon, Tues, Wed, Thurs, Fri, Sat, Sun};
printf("Mon=%d\nTues=%d\nWed=%d\nThurs=%d\nFri=%d\nSat=%d\nSun=%d\n", Mon, Tues, Wed, Thurs, Fri, Sat, Sun);

在没有显示说明的情况下,枚举常量(也就是花括号中的常量名)默认第一个枚举常量的值为0,往后每个枚举常量依次递增1,所以Mon=0,Tues=1,····Sun=6,下面来验证一下

(显示说明部分枚举常量的值):

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

上面的代码中,只显式说明了枚举常量Mon的值为1,未指定的枚举名的值将依着最后一个指定值向后依次递增(注意是最后一个指定值)

总结

  • 1、在没有显示说明的情况下,枚举常量(也就是花括号中的常量名)默认第一个枚举常量的值为0,往后每个枚举常量依次递增1

  • 2、在部分显示说明的情况下,未指定的枚举名的值将依着之前最有一个指定值向后依次递增

  • 3、一个整数不能直接赋值给一个枚举变量,必须用该枚举变量所属的枚举类型进行类型强制转换后才能赋值

  • 4、同一枚举类型中不同的枚举成员可以具有相同的值

  • 5、同一个程序中不能定义同名的枚举类型,不同的枚举类型中也不能存在同名的枚举成员(枚举常量)

enum与typedef配合使用

typedef enum week{Mon = 1, Tues, Wed, Thurs}WEEK;
typedef enum{Mon = 1, Tues, Wed, Thurs}WEEK;
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ManGo CHEN

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值