qkhhxkj 风的距离

导航

枚举类型

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

posted on 2011-06-29 23:25  qkhhxkj  阅读(471)  评论(0编辑  收藏  举报