十二、枚举类型
12.1概述
在实际问题中,有些变量的取值被限定在一个有限的范围内。例如,一个星期内只有七天,一年只有十二个月,一个班每周有六门课程等等。如果把这些量说明为整型,字符型或其它类型显然是不妥当的。
为此,C语言提供了一种称为“枚举”的类型。在“枚举”类型的定义中列举出所有可能的取值,被说明为该“枚举”类型的变量取值不能超过定义的范围。注意,枚举类型是一种基本数据类型,而不是一种构造类型,因为它不能再分解为任何基本类型。
12.2枚举类型的定义
enum 枚举名{枚举值表};
在枚举值表中应罗列出所有可用值,这些值被称为枚举元素。
12.3 枚举变量的声明
enum weekday{sun, mou, tue, wed, thu, fri, sat}; //定义枚举类型
enum weekday a, b, c; //先定义,后声明
enum weekday{sun, mou, tue, wed, thu, fri, sat}a, b, c; //同时定义和声明
enum {sun, mou, tue, wed, thu, fri, sat}a, b, c; //直接声明
12.4 枚举变量的赋值
a. 枚举值是常量,不是变量。不能在程序中用赋值语句再对它赋值。
b. 枚举元素本身由系统定义了一个表示序号的数值,从0开始顺序定义为0,1,2…,如在weekday中,sun值为0,mon 值为1,…, sat 值为6。
c. 只能把枚举值赋予枚举变量,不能把元素的数值直接赋予枚举变量
d. 如一定要把数值赋予枚举变量,则必须用强制类型转换。
e. 枚举元素不是字符常量也不是字符串常量,使用时不要加单、双引号。
a = sum; b = mon; //正确的
a = 0; b = 1; //错误的
a = (enum weekday)2; //强制类型转换,把数值赋予枚举变量,相当于 a = tue
十三、类型定义符 typedef
C语言还允许由用户自己定义类型说明符,也就是说允许由用户为数据类型取“别名”。类型定义符typedef即可用来完成此功能。
其一般形式为:typedef 原类型名 新类型名
,其中原类型名中含有定义部分,新类型名一般用大写表示,以便于区别。
typedef int INTEGER //用INTEGER来代替int 作整型变量的类型说明了。
INTEGER a, b; //等价于 int a, b
用 typedef 定义数组、指针、结构等类型将带来很大的方便,不仅使程序书写简单而且使意义更为明确,因而增强了可读性。
typedef char NAME[20]; //表示NAME是字符数组类型,数组长度为 20
NAME a1, a2, a3; //等效于 char a1[20], a2[20], a3[20]
typedef struct stu
{
char name[20];
int age;
char sex;
}STU;
STU boy1, boy2; //定义STU表示stu的结构类型,然后可用STU来说明结构变量
有时也可用宏定义来代替 typedef 的功能,但是宏定义是由预处理完成的,而 typedef 则是在编译时完成的,后者更为灵活方便。