目录
最近在工作中,牵扯到一个关于枚举的使用,特此来总结一下。 (因为在遇到一个实际问题的时候,发现大家都不定义枚举变量名),我是很不理解的,
枚举变量的默认赋值
枚举变量在未分配初始值的时候,默认情况下,第一个枚举成员的默认值为“0”,后续的枚举成员值为前一个枚举成员的值(按文本顺序)加一。但是,其值必须在基础类型可以表示的值范围内;
枚举类型,通过预定义列出所有值的标识符来定义有序集,其顺序与枚举类型描述中的标识符顺序一致。枚举类型的形式:(标识符1,...,标识符n)。
枚举元素只能是标识符,而不是数字常量或字符常量。枚举在C/C++/c#中,是一个被命名的整型常数的集合, 枚举在日常生活中很常见。例如表示星期的SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY,SATURDAY,就是一个枚举。
默认值如果非连续呢?又该如何?
如:
enum {
STATION_IDLE = 0,
STATION_CONNECTING = 8,
STATION_WRONG_PASSWORD = 3,
STATION_NO_AP_FOUND = 9,
STATION_CONNECT_FAIL,
STATION_GOT_IP
};
那最后两个的值,该是多少呢?
为了验证这个问题,做个小实验:
#include <iostream>
#include <stdio.h>
using namespace std;
enum egg {a=10,b=5,c,d=8,e};
int main()
{
printf("a = %d\n", a) ;
printf("b = %d\n", b) ;
printf("c = %d\n", c) ;
printf("d = %d\n", d) ;
printf("e = %d\n", e) ;
}
运行效果如图:
可见,对于枚举类中的没有存值的变量,默认将其值存为上一个变量所存的值加1。
枚举可以没有枚举名
如果声明枚举类型时没有指定枚举名,其作用就和#define类似。
enum {
STATION_IDLE = 0,
STATION_CONNECTING,
STATION_WRONG_PASSWORD,
STATION_NO_AP_FOUND,
STATION_CONNECT_FAIL,
STATION_GOT_IP
};
相当于:
#define STATION_IDLE = 0;
#define STATION_CONNECTING = 1;
#define STATION_WRONG_PASSWORD = 2;
#define STATION_NO_AP_FOUND = 3;
#define STATION_CONNECT_FAIL = 4;
#define STATION_GOT_IP = 5;
如果要表示同一个事件的不同反馈status,使用这种没有枚举名的枚举效果更好。
枚举定义
enum 枚举类型名 {变量值列表};
关键字enum——指明其后的标识符是一个枚举类型的名字。
变量值列表——由枚举量构成,各枚举量之间以“ ,”间隔,且必须各不相同。
举例:
enum Week{
MONDAY,
TUESDAY,
WEDNESDAY,
THURSDAY,
FRIDAY,
SATURDAY,
SUNDAY
}
使用枚举类型注意
枚举中每个成员(标识符)结束符是"," 不是";", 最后一个成员可省略","。
初始化时可以赋负数, 以后的标识符仍依次加1。
枚举变量只能取枚举说明结构中的某个标识符常量。