C++枚举类型

如果一个变量只有几种可能的值,可以定义为枚举(enumeration)类型。所谓“枚举”是指将变量的值一一列举出来,变量的值只能在列举出来的值的范围内。声明枚举类型用enum开头。例如:
    enum  weekday{sun, mon, tue, wed, thu, fri, sat};

上面声明了一个枚举类型weekday,花括号中sun, mon, …, sat等称为枚举元素或枚举常量。表示这个类型的变量的值只能是以上7个值之一。它们是用户自己定义的标识符。

声明枚举类型的一般形式为:
   enum 枚举类型名{枚举常量表列};

在声明了枚举类型之后,可以用它来定义变量。如:
    weekday workday,week_end;
这样,workday和week_end被定义为枚举类型weekday的变量。

在C语言中,枚举类型名包括关键字enum,以上的定义可以写为:
   enum weekday  workday,week_end;
在C++中允许不写enum,一般也不写enum,但保留了C的用法。根据以上对枚举类型weekday的声明,枚举变量的值只能是sun到sat之一。例如:
    workday=mon; week_end=sun;
是正确的。也可以直接定义枚举变量,如:
   enum{sun, mon, tue, wed, thu, fri, sat} workday,week_end;
这些标识符并不自动地代表什么含义。

对枚举类型的几点说明:
  1. 对枚举元素按常量处理,故称枚举常量。
  2. 枚举元素作为常量,它们是有值的,C++编译按定义时的顺序对它们赋值为0,1,2,3,…。也可以在声明枚举类型时另行指定枚举元素的值。
  3. 枚举值可以用来做判断比较。
  4. 一个整数不能直接赋给一个枚举变量。

【例7.8】口袋中有红、黄、蓝、白、黑5种颜色的球若干个。每次从口袋中任意取出3个球,问得到3种不同颜色的球的可能取法,输出每种排列的情况。
#include <iostream>
#include <iomanip>//在输出时要用到setw控制符
using namespace std;
int main( )
{
   enum color {red,yellow,blue,white,black}; //声明枚举类型color
   color pri; //定义color类型的变量pri
   int i,j,k,n=0,loop; //n是累计不同颜色的组合数
   for (i=red;i<=black;i++) //当i为某一颜色时
      for (j=red;j<=black;j++) //当j为某一颜色时
         if (i!=j) //若前两个球的颜色不同
         {
            for (k=red;k<=black;k++) //只有前两个球的颜色不同,才需要检查第3个球的颜色
               if ((k!=i) && (k!=j)) //3个球的颜色都不同
               {
                  n=n+1;//使累计值n加1
                  cout<<setw(3)<<n; //输出当前的n值,字段宽度为3
                  for (loop=1;loop<=3;loop++) //先后对3个球作处理
                  {
                      switch (loop) //loop的值先后为1,2,3
                      {
                         case 1: pri=color(i);break ; //color(i)是强制类型转换,使pri的值为i
                         case 2: pri=color(j);break ; //使pri的值为j
                         case 3: pri=color(k);break ; //使pri的值为k
                         default :break ;
            }

            switch (pri)//判断pri的值,输出相应的“颜色”
            {
               case red: cout<<setw(8)<<"red"; break;
               case yellow: cout<<setw(8)<<"yellow";break;
               case blue:cout<<setw(8)<<"blue"; break ;
               case white:cout<<setw(8)<<"white"; break ;
               case black:cout<<setw(8)<<"black"; break ;
               default : break ;
            }
         }
         cout<<endl;
      }
   }
   cout<<"total:"<<n<<endl; //输出符合条件的组合的个数
   return 0;
}
运行结果如下:
1 red yellow blue 2 red yellow white 3 red yellow black



58 black white red
59 black white yellow
60 black white blue
total:60

不用枚举常量,而用常数0代表“红”,1代表“黄”……也可以。但显然用枚举变量更直观,因为枚举元素都选用了令人“见名知意”的标识符,而且枚举变量的值限制在定义时规定的几个枚举元素范围如果赋予它一个其他的值,就会出现出错信息,便于检查。