作者:[柒号华仔]
个人信条:星光不问赶路人,岁月不负有心人。
个人方向:专注于5G领域,同时兼顾其他网络协议,编解码协议,C/C++,linux等,感兴趣的小伙伴可以关注我,一起交流。
枚举概念
在数学和计算机科学理论中,一个集的枚举是列出某些有穷序列集的所有成员的程序,或者是一种特定类型对象的计数。通俗来讲,枚举是具有共同属性的一类整数常数的有限集合,例如星期一到星期天,就是一个成员个数为7的枚举类型,枚举成员也称为枚举项:
typedef enum week{
Monday,
Tuesday,
Wednesday,
Thursday,
Friday,
Saturday,
Sunday
}week_e;
枚举定义
在上面的例子中可以看到,枚举定义的关键字是enum,其定义形式为:
enum 枚举名{
标识符[=整型常数],
标识符[=整型常数],
...
标识符[=整型常数]
} 枚举变量;
中括号内的整型常数可以指定该枚举项的值,如果全部没有指定,则第一个枚举项数值为0,其后依次加1,例如:
typedef enum number{
a,
b,
c,
d
}number_e;
实际为a=0,b=1,c=2,d=3。
如果给某一个枚举项指定了数值,其后的项在该数值上依次加1,例如:
typedef enum number{
a,
b = 3,
c,
d
}number_e;
实际为a=0,b=3,c=4,d=5。
允许多个枚举成员具有相同的值,例如:
typedef enum number{
a,
b = 3,
c = 3,
d
}number_e;
实际为a=0,b=3,c=3,d=4。
枚举使用
我们知道,程序是为现实生活服务的,例如四季、月份、星期、楼栋、社区、颜色等,在本人的工作中,有着大量消息ID,状态机管理,工作模式,通信制式等具有共同属性的一类数据集合,如果单纯的用数字0、1、2...来表示,程序的可读性和可维护性非常差,可能过上几个月,自己都看不懂自己写的程序了,出现问题时也很难快速定位。如果能在程序中用具有相应实际含义的名称来代表某一状态,则程序容易阅读和理解。
这也引出一个问题,即一个枚举中的成员都应该是同一类的,不要把不同表达含义的成员混在一起,不然就失去了使用枚举的意义。例如把星期和社区放在一个枚举类型中,这种时间和空间的混杂显得非常没有条理。
在实际使用中,我们应注意以下几点:
- 枚举是常量,不是变量,因此在使用过程中不能再对其进行赋值;
- 枚举成员可以为负数,其后成员依然是依次加1;
- 直接使用枚举成员名称即可,无需附加枚举名;
- 一个枚举成员名称只在整个程序中定义一次,不要重复定义;
枚举举例
#include <stdio.h>
typedef enum season{
SPRING = 1,
SUMMER,
AUTUMN,
WINTER
}season_e;
int main(void)
{
int season = 4;
switch (season){
case SPRING:
printf("The color of Q%d is red!\n",SPRING);
break;
case SUMMER:
printf("The color of Q%d is green!\n",SUMMER);
break;
case AUTUMN:
printf("The color of Q%d is yellow!\n",AUTUMN);
break;
case WINTER:
printf("The color of Q%d is white!\n",WINTER);
break;
default:
printf("There is no such season!\n");
break;
}
return 0;
}
运行结果:
The color of Q4 is white!
WINTER是枚举成员,字面意思为“冬季”,实际为数值4。