enum in C++

很多初学者对枚举(enum)感到迷惑,或者认为没什么用,其实枚举(enum)是个很有用的数据类型。

枚举类型的使用方法

一般的定义方式如下:

enum enum_type_name
{
ENUM_CONST_1,
ENUM_CONST_2,
...
ENUM_CONST_n
} ;


实际上enum_type_name类型是对一个变量取值范围的限定,而花括号内是它的取值范围,即enum_type_name 类型的变量enum_variable_name 只能取值为花括号内的任何一个值,如果赋给该类型变量的值不在列表中,则会报错或者警告。

ENUM_CONST_1、ENUM_CONST_2、...、ENUM_CONST_n,这些成员都是常量,也就是我们平时所说的枚举常量(常量一般用大写)。

{
ENUM_CONST_1,
ENUM_CONST_2,
...
ENUM_CONST_n
} enum_variable_name;


注意:enum_type_name 是自定义的一种数据数据类型名,而enum_variable_name 为enum_type_name类型的一个变量,也就是我们平时常说的枚举变量。实际上enum_type_name类型是对一个变量取值范围的限定,而花括号内是它的取值范围,即enum_type_name 类型的变量enum_variable_name 只能取值为花括号内的任何一个值,如果赋给该类型变量的值不在列表中,则会报错或者警告。ENUM_CONST_1、ENUM_CONST_2、...、ENUM_CONST_n,这些成员都是常量,也就是我们平时所说的枚举常量(常量一般用大写)。

enum 变量类型还可以给其中的常量符号赋值,如果不赋值则会从被赋初值的那个常量开始依次加1,如果都没有赋值,它们的值从0 开始依次递增1。

如分别用一个常数表示不同颜色:

enum Color
{
GREEN = 1, //1
RED, //2
BLUE, //3
GREEN_RED = 10,//10
GREEN_BLUE //11

}ColorVal;

其中各常量名代表的数值分别为:

GREEN = 1
RED = 2
BLUE = 3
GREEN_RED = 10
GREEN_BLUE = 11

举个例子说明一下吧,便于理解

  1. #include <iostream>   
  2. using namespace std;   
  3.   
  4. void main(void)   
  5. {   
  6.     enum egg {a,b,c};   
  7.     enum egg test; //在这里你可以简写成egg test;   
  8.     test = c;   
  9.     if (test==c)   
  10.     {   
  11.         cout <<"枚举变量判断:test枚举对应的枚举元素是c" << endl;   
  12.     }   
  13.       
  14.     if (test==2)   
  15.     {   
  16.         cout <<"枚举变量判断:test枚举元素的值是2" << endl;   
  17.     }   
  18.     cout << a << "|" << b << "|" << test <<endl;   
  19.     test = (enum egg) 0; //强制类型转换   
  20.     cout << "枚举变量test值改变为:" << test <<endl;   
  21.     cin.get();   
  22. }  

枚举与#define 宏的区别

下面再看看枚举与#define 宏的区别:

1)#define 宏常量是在预编译阶段进行简单替换。枚举常量则是在编译的时候确定其值。

2)一般在编译器里,可以调试枚举常量,但是不能调试宏常量。

3)枚举可以一次定义大量相关的常量,而#define 宏一次只能定义一个。

sizeof(ColorVal)的值为多少?为什么?

下面是我看到的一个很好的东西,讨论组里的,很不错,高手不少啊,O(∩_∩)O~

大家也来测试一下自己的水平怎么样吧,看看下面这个例子,给个结果吧

  1. typedef struct weekday_st  
  2. {  
  3.     enum week  {sun=123456789,mon,tue,wed,thu,fri,sat,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,aa,ab,ac,ad,ae,af,ag,ah,ai,aj,ak};  
  4.     enum day{monring, moon, aftermoon};  
  5. }weekday_st;  
  6.   
  7. int main(int argc, char *argv[])  
  8. {  
  9.     printf("sizeof(weekday_st)=%d\n", sizeof(weekday_st));  
  10.     printf("sizeof(weekday)=%d\n", sizeof(weekday_st::week));  
  11.     printf("sizeof(day)=%d\n", sizeof(weekday_st::day));  
  12.     return 0;  
  13. }  
结果如下,你答对了吗?O(∩_∩)O~
  1. sizeof(weekday_st)=1  
  2. sizeof(weekday)=4  
  3. sizeof(day)=4  
具体来说一下为什么吧?

printf("sizeof(weekday_st)=%d\n", sizeof(weekday_st));

这里因为结构体里面并没有定义任何的变量,其实只是两个类型(内嵌“类型”)而已,所以这个结构是空的,但是用sizeof进行运算的话也不能返回0,因为毕竟存在着这么一个东西,所以这时sizeof返回一个在机器里面所能表达的最小的存储单位的值,一般的PC里面最小的存储单位的值是char,所以sizeof返回1,你可以试着改变一下上面的实例如下:

  1. typedef struct weekday_st  
  2. {  
  3.     enum week{sun=123456789,mon,tue,wed,thu,fri,sat,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,aa,ab,ac,ad,ae,af,ag,ah,ai,aj,ak}my_week;  
  4.     enum day{monring, moon, aftermoon}my_day;  
  5. }weekday_st;  
  6.   
  7. int main(int argc, char *argv[])  
  8. {  
  9.     printf("sizeof(weekday_st)=%d\n", sizeof(weekday_st));  
  10.     printf("sizeof(weekday)=%d\n", sizeof(weekday_st::week));  
  11.     printf("sizeof(day)=%d\n", sizeof(weekday_st::day));  
  12.     return 0;  
  13. }  
这个时候结构体里面就不简单只是两个类型了,而是定义了一个week类型的变量my_week和一个day类型的变量my_day,这个时候的结果就是以下内容了
  1. sizeof(weekday_st)=8  
  2. sizeof(weekday)=4  
  3. sizeof(day)=4  
是不是还有一个疑问,接着看吧

printf("sizeof(weekday)=%d\n", sizeof(weekday_st::week));

printf("sizeof(day)=%d\n", sizeof(weekday_st::day));

enum实参被提升的时候,提升到下一个能够表示其所有枚举常量的类型.: int,unsigned int,long ,unsigned long,所以在你的机子上,sizeof(enum)都等于4也是正常的,所以枚举量是当作整型常量来处理的,所以上面这两个sizeof都是返回4

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值