枚举类型
9 枚举类型
枚举类型是 ANSI C 新标准所增加的。
如果一个变量只有几种可能的值,可以定义为枚举类型,所谓的枚举是批将变量的值一一列举出来,变量的值只限于列举出来的值的范围内。
声明一个枚举类型用 enum 开头例如:
enum weekday{sun, mon, tue, wed, thu, fri, sat};
声明了一个枚举类型 enum weekday,可以用此类型来定义如:
enum weekday workday, week_end;
workday 和 week_end 被定义为枚举变量,它们的值只能是 sun 到 sat 之一。例如:
workday = mon;
week_end = sun;
是正确的。
当然也可以直接定义枚举变量如:
enum{sun, mon, tue, wed, thu, fri,sat}workday, week_end;
其中 sun, mon, ... , sat 等称为枚举元素或枚举常量,它们是用户定义的标识符。这些标识符并不自动地代表什么含义,
说明:
(1)在C编译中,对枚举元素按常量处理,故称枚举常量,它们不是变量,不能对它们赋值,例如:
sun = 0; mon = 1;
是错误的。
(2)枚举元素作为常量,它们是有值的,C语言编译按定义时的顺序使它们的值为 0, 1, 2 ...
在上面定义中,sun 值为 0 mon 的值为 1,.... sat 的值为 6 如果有赋值语句:
workday = mon;
workday 变量的值为 1 。这个整数是可以输出的。如:
printf("%d", workday);
将输出整数 1。
也可以改变枚举元素的值,在定义时由程序员指定,如:
enum weekday{sun=7,mon=1,tue, wed, thu,fri, sat} workday, week_end;
定义 sun 为 7 ,mon = 1 ,以后顺序加 1 ,sat 为 6。
(3)枚举值可以用来做判断比较如:
if(workday == mon).....
if(workday > sun)....
枚举值的比较规则是按其在定义时的顺序号比较的,如果定义时未指定,则第一个枚举值默认为 0 。故 mon 大于 sun, sat > fri。
(4)一个整数不能直接赋值给一个枚举变量。如:
workday = 2;
是不正确的,它们属于不同的类型。应先进行强制类型转换才能赋值。如:
workday = (enum weekday)2;
它相当于将顺序号为 2 的枚举元素赋给 workday,相当于
workday = true;
甚至可以是表达式。如:
workday = (enum weekday)(5-3);
如下例子程序:
#include <stdio.h>
#include <stdlib.h>
void main()
{
enum color {red, yellow, blue, white, black};
int i, j, k, pri;
int n, loop;
n = 0;
for(i=red; i<black; i++)
for(j=red; j<black; j++)
if(i != j)
{
for(k=red; k<black; k++)
if((k != i) && (k != j))
{
n++;
printf("%-4d", n);
for(loop=1;loop<=3;loop++)
{
switch(loop)
{
case 1: pri = i;break;
case 2: pri = j;break;
case 3: pri = k;break;
default: break;
}
switch(pri)
{
case red: printf("%-10s", "red"); break;
case yellow: printf("%-10s", "yellow"); break;
case blue: printf("%-10s", "blue"); break;
case white: printf("%-10s", "white"); break;
case black: printf("%-10s", "black"); break;
default: break;
}
}
printf("\n");
}
}
printf("\n total: %5d\n", n);
system("pause");
}
运行结果
3 red blue yellow
4 red blue white
5 red white yellow
6 red white blue
7 yellow red blue
8 yellow red white
9 yellow blue red
10 yellow blue white
11 yellow white red
12 yellow white blue
13 blue red yellow
14 blue red white
15 blue yellow red
16 blue yellow white
17 blue white red
18 blue white yellow
19 white red yellow
20 white red blue
21 white yellow red
22 white yellow blue
23 white blue red
24 white blue yellow