使用枚举类型,可以提高程序代码的健壮性和可读性,并且枚举成员属于常量,甚至可以使用枚举成员名作为维的大小,来进行数组的定义
枚举的定义
定义枚举的格式为
enum 枚举名{枚举成员1,枚举成员2,...};
下面来定义一个和方向相关的枚举类型Dir
enum Dir{UP,DOWN,LEFT,RIGHT};
枚举成员属于常量,默认情况下,枚举成员是一个整型值,其第一个枚举成员的值为0,而后续枚举成员的值为其前一个枚举成员的值加1
printf("UP = %d\n",UP);
printf("DOWN = %d\n",DOWN);
printf("LEFT = %d\n",LEFT);
printf("RIGHT = %d\n",RIGHT);
结果如下
UP = 0
DOWN = 1
LEFT = 2
RIGHT = 3
也可以自己设置枚举成员的值
enum Dir{UP,DOWN = 10,LEFT,RIGHT};
printf("UP = %d\n",UP);
printf("DOWN = %d\n",DOWN);
printf("LEFT = %d\n",LEFT);
printf("RIGHT = %d\n",RIGHT);
结果如下
UP = 0
DOWN = 10
LEFT = 11
RIGHT =12
枚举成员是一个常量,可以将其作为定义数组的长度大小,也可以将其作为一个整型值初始化或赋值给一个整型变量,甚至将其作为表达式的一部分
enum Dir{UP,DOWN,LEFT,RIGHT};
char arr[RIGHT];
int i = UP;
i = DOWN + 3;
枚举变量的定义
定义好枚举之后,就拥有了相应的枚举类型,可以根据这个枚举类型来定义相应的枚举变量。与结构体和联合体的变量定义方式类似,在定义枚举变量时,也可以采用以下3种不同的方式
(1)先定义枚举,再定义枚举变量
enum Dir dir1;
(2)在定义枚举的同时定义枚举变量
enum Dir{UP = -3,DOWN,LEFT,RIGHT}dir2;
(3)定义无名枚举类型的枚举变量
enum {UP = -3,DOWN,LEFT,RIGHT}dir3;
第一种方式可以定义出具有局部或全局作用域的枚举变量
第二种和第三种定义出来的都是具有全局作用域的枚举变量
由于第三种方式定义的是无名枚举类型,因此,只能在该枚举类型定义处直接定义枚举变量,在其它地方无法定义出该类型的枚举变量
枚举变量的初始化与赋值
在定义枚举变量的同时,可以对其进行初始化
enum Dir dir1 = LEFT;
也可以对枚举变量进行赋值操作
enum Dir dir2;
dir2 = DOWN;
可以将枚举成员视为整型常量,而将枚举变量视为整型变量。因此,可以将一个整型值初始化或赋值给枚举变量
enum Dir dir = 2;
dir = 1;
编写程序,用键盘上的W、S、A、D四个按键来表示上、下、左、右四个方向,当用户按下相应按键后,程序能够打印输出用户所选择的方向
#include <stdio.h>
#include <ctype.h>
enum Dir{UP,DOWN,LEFT,RIGHT};
void printDirect(enum Dir dir)
{
switch(dir)
{
case UP:
printf("The direction is UP.\n");
break;
case DOWN:
printf("The direction is DOWN.\n");
break;
case LEFT:
printf("The direction is LEFT.\n");
break;
case RIGHT:
printf("The direction is RIGHT.\n");
break;
}
}
int main()
{
enum Dir dir;
char ch;
printf("Please determine a direction:\n");
scanf("%c",&ch);
ch = islower(ch) ? toupper(ch) : ch;
switch(ch)
{
case 'W':
dir = UP;
break;
case 'S':
dir = DOWN;
break;
case 'A':
dir = LEFT;
break;
case 'D':
dir = RIGHT;
break;
}
printDirect(dir);
return 0;
}
主函数中,首先定义了两个变量,一个是枚举Dir类型的变量dir,一个是字符类型变量ch。在获取用户输入的字符后,将其保存至变量ch中,若用户输入的是小写字母,可以通过三目条件运算符,将存储在变量ch中的小写字母转换为大写字母。接着在switch语句中,当找到与变量ch匹配的case标签后,能够将一个正确的枚举成员赋值给枚举变量dir。最后,将枚举变量dir作为printDirect函数的实参,进行函数的调用
结果如下
Please determine a direction:
a
The direction is LEFT.