zoukankan      html  css  js  c++  java
  • 枚举类型

    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

  • 相关阅读:
    P1939 【模板】矩阵加速(数列)
    NUMBER BASE CONVERSION POJ
    Raid POJ
    Genius ACM HihoCoder
    BZOJ1500: [NOI2005]维修数列 Splay维护序列
    BZOJ3245: 最快路线 拆点dijkstra
    存个头
    895E
    894E
    tarjan缩点/求桥模板
  • 原文地址:https://www.cnblogs.com/qkhhxkj/p/2093867.html
Copyright © 2011-2022 走看看