1.枚举(Enum)类型特点:
能够列出所有可能的取值,并给它们取一个名字。(一种新的数据类型)
2.枚举(Enum)语法格式:
enum typeName{ valueName1, valueName2, valueName3, ...... };
注:
①typeName是枚举类型的名字。
(是一个标识符,可以看成这个集合的名字,是一个可选项,即是可有可无的项。)
②valueName1, valueName2, valueName3, ......是每个值对应的名字的列表。
③枚举类型是一个集合,集合中的元素(枚举成员)是一些命名的整型常量。
④枚举类型是预处理指令#define的替代。
例:(列出一个星期有几天)
enum week{ Mon, Tues, Wed, Thurs, Fri, Sat, Sun };
可以看到,我们仅仅给出了名字,却没有给出名字对应的值,这是因为枚举值默认从 0 开始,往后逐个加 1(递增);也就是说,week 中的 Mon、Tues ...... Sun 对应的值分别为 0、1 ...... 6。
我们也可以给每个名字都指定一个值:(可以人为设定枚举成员的值,从而自定义某个范围内的整数)
enum week{ Mon = 1, Tues = 2, Wed = 3, Thurs = 4, Fri = 5, Sat = 6, Sun = 7 };
更为简单的方法是只给第一个名字指定值:
enum week{ Mon = 1, Tues, Wed, Thurs, Fri, Sat, Sun };
这样枚举值就从 1 开始递增,与②的写法是等效的。
枚举是一种类型,通过它可以定义枚举变量:
enum week a, b, c;
也可以在定义枚举类型的同时定义变量:
enum week{ Mon = 1, Tues, Wed, Thurs, Fri, Sat, Sun } a, b, c;
有了枚举变量,就可以把列表中的值赋给它:
enum week{ Mon = 1, Tues, Wed, Thurs, Fri, Sat, Sun };
enum week a = Mon, b = Wed, c = Sat;
或者:
enum week{ Mon = 1, Tues, Wed, Thurs, Fri, Sat, Sun } a = Mon, b = Wed, c = Sat;
注:
(1)枚举列表中的 Mon、Tues、Wed 这些标识符的作用范围是全局的(严格来说是 main() 函数内部),不能再定义与它们名字相同的变量。
(2)Mon、Tues、Wed 等都是常量,不能对它们赋值,只能将它们的值赋给其他的变量。
(3)Mon、Tues、Wed 等都不是变量,它们不占用数据区(常量区、全局数据区、栈区和堆区)的内存,而是直接被编译到命令里面,放到代码区,所以不能用&取得它们的地址。(枚举的本质)
(4)枚举和宏其实非常类似:宏在预处理阶段将名字替换成对应的值,枚举在编译阶段将名字替换成对应的值。我们可以将枚举理解为编译阶段的宏。
3.枚举(Enum)的用法:
①一般的定义方式如下:
enum enum_type_name
{
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 DAY
{
MON=1, TUE, WED, THU, FRI, SAT, SUN
};
enum DAY yesterday;
enum DAY today;
enum DAY good_day, bad_day;
方法二:类型定义与变量声明同时进行
enum //与上面定义不同的是:此处的标号DAY被省略,这是允许的
{
MON=1, TUE, WED, THU, FRI, SAT, SUN
}workday; //变量workday的类型为枚举型enum(或enum DAY)
workday = MON;
方法三:用typedef关键字将枚举类型定义成别名,并利用该别名进行变量声明
typedef enum workday //此处的workday可省略,或者改成其它名字,不会影响后面
{
MON=1, TUE, WED, THU, FRI, SAT, SUN
} workday; //此处的workday为枚举类型enum workday的别名,类似于int
workday today, tomorrow;//变量today和tomorrow的类型为枚举型workday,也即enum workday