zoukankan      html  css  js  c++  java
  • C/C++:[2]enum-枚举量声明、定义和使用

    C/C++:[2]enum-枚举量声明、定义和使用

    转自:http://jingyan.baidu.com/article/e75aca85526c1b142edac6d9.html

    众所周知,C/C++语言可以使用#defineconst创建符号常量,而使用enum工具不仅能够创建符号常量,还能定义新的数据类型,但是必须按照一定的规则进行,下面我们一起看下enum的使用方法。

    C/C++:[2]enum-枚举量声明、定义和使用
     

    工具/原料

    • Microsoft Visual Studio 2012(或其他版本)

    步骤1——枚举量的声明和定义

    1. 1

      首先,请看下面的语句:

      enum enumType {Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday};

      这句话有两个作用:

      第一:声明enumType为新的数据类型,称为枚举(enumeration);

      第二:声明Monday、Tuesday等为符号常量,通常称之为枚举量,其值默认分别为0-6。(后面会介绍怎样显式的初始化枚举量的值)

    2. 2

      接着利用新的枚举类型enumType声明这种类型的变量:

      enumType Weekday;

      就像使用基本变量类型int声明变量一样,如 int a;

      然而与基本变量类型不同的地方是,在不进行强制转换的前提下,只能将定义的枚举量赋值给该种枚举的变量,如:

      Weekday = Monday;

      或者

      Weekday = Sunday;

      不能将其他值赋给枚举变量,如:

      Weekday = 10;

      这是不允许的,因为10不是枚举量

      也就是说Weekday只能是定义的Monday-Sunday这些定义过的枚举量

      然而这不是绝对的,第六条会讲到利用强制类型转换将其他类型值赋给枚举变量

    3. 3

      上面讲不能将枚举量赋给枚举变量,那么能不能将枚举量赋给非枚举变量呢?如:

      int a=Monday;

      这是允许的,因为枚举量是符号常量,这里的赋值编译器会自动把枚举量转换为int类型。

    4. 4

      前面讲可以对枚举进行赋值运算,那枚举变量能不能进行算术运算呢?

      Weekday++;

      Weekday = Monday + Tuesday;

      这是非法的,因为这些操作可能导致违反类型限制,比如:

      Weekday = Sunday;

      Weekday++;

      Weekday首先被赋予枚举量中的最后一个值Sunday(值为6),再进行递增的话,Weekday增加到7,而对于enumType类型来说,7是无效的。

      总结:对于枚举,只定义了赋值运算符,没有为枚举定义算术运算。

    5. 5

      不能对枚举量进行算术运算,那么枚举量能不能参与其他类型变量的运算呢?

      int a;

      a = 1 + Monday;

      这是允许的,因为编译器会自动把枚举量转换为int类型。

    6. 6

      第二条讲:在不进行强制转换的前提下,只能将定义的枚举量赋值给该种枚举的变量,言下之意就是可以通过强制转换将其他类型值赋给枚举变量

      Weekday = enumType(2);

      等同于:

      Weekday = Wednesday;

      但是,如果试图将一个超出枚举取值范围的值通过强制转换赋给枚举变量,会出现什么结果?

      Weekday = enumType(20);

      结果将是不确定的,这么做不会出错,但得不到想要的结果。

      END

    步骤2——自定义枚举量的值

    1. 1

      前面讲通过定义

      enum enumType {Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday};

      枚举量Monday、Tuesday等的值默认分别为0-6,我们可以显式的设置枚举量的值:

      enum enumType {Monday=1, Tuesday=2, Wednesday=3, Thursday=4, Friday=5, Saturday=6, Sunday=7};

      指定的值必须是整数

    2. 2

      也可以只显式的定义一部分枚举量的值:

      enum enumType {Monday=1, Tuesday, Wednesday=1, Thursday, Friday, Saturday, Sunday};

      这样Monday、Wednesday均被定义为1,则Tuesday=2,Thursday、Friday、Saturday、Sunday的值默认分别为2、3、4、5.

      总结:未被初始化的枚举值的值默认将比其前面的枚举值大1。

    3. 3

      第二条还说明另外一个现象,就是枚举量的值可以相同。

      END

    步骤3——枚举的取值范围

    1. 1

      前面讲到可以通过强制转换将其他类型值赋给枚举变量:

      Weekday = enumType(2);

      这是合法的;但是

      Weekday = enumType(20);是非法的。

      这里涉及枚举取值范围的概念:

      枚举的上限是 大于最大枚举量的 最小的2的幂,减去1;

      枚举的下限有两种情况:一、枚举量的最小值不小于0,则枚举下限取0;二、枚举量的最小值小于0,则枚举下限是 小于最小枚举量的 最大的2的幂,加上1。

      举例来讲:

      假如定义 enum enumType1 { First=-5,Second=14,Third=10 };

      则枚举的上限是16-1=15(16大于最大枚举量14,且为2的幂);

        枚举的下限是-8+1=-7(-8小于最小枚举量-5,且为2的幂);

      END

    步骤4——枚举应用

    1.  

      个人觉得枚举switch是最好的搭档:

      enum enumType{Step0, Step1, Step2}Step=Step0;

      //注意这里在声明枚举的时候直接定义了枚举变量Step,并初始化为Step0

      switch (Step)

      {

        case Step0:{...;break;}

        case Step1:{...;break;}

        case Step2:{...;break;}

        default:break;

      }

      END

    注意事项

    • 在实际应用中,枚举常常用来定义符号常量。

      自己实现的示例代码如下:

       1 #include <iostream>
       2 
       3 
       4 enum WeekType
       5 {
       6     Sun   =0,
       7     Mon   =1,
       8     Tue,
       9 };
      10 
      11 void CallWeek(WeekType wk)
      12 {
      13     switch(wk)
      14     {
      15     case Sun:
      16         std::cout<<"周一......"<<std::endl;
      17         break;
      18     case Mon:
      19         std::cout<<"周二......" <<std::endl;
      20         break;
      21     case Tue:
      22         std::cout<<"周三......" <<std::endl;
      23         break;
      24     default:
      25         std::cout<<"Waring......" <<std::endl;
      26         break;
      27     }
      28 
      29 }
      30 
      31 
      32 
      33 int main(int argc,char **argv)
      34 {
      35     WeekType iWk=WeekType::Mon;
      36     int a =WeekType::Tue;
      37 
      38     switch(a)
      39     {
      40         case 0:
      41             std::cout<<"周一......"<<std::endl;
      42             break;
      43         case 1:
      44             std::cout<<"周二......" <<std::endl;
      45             break;
      46         case 2:
      47             std::cout<<"周三......" <<std::endl;
      48             break;
      49         default:
      50             std::cout<<"Waring......" <<std::endl;
      51             break;
      52     }
      53 
      54     CallWeek(iWk);
      55 
      56     return 0;
      57 }
      View Code
  • 相关阅读:
    OSG-提示“error reading file e:1.jpg file not handled”
    OSG-加载地球文件报0x00000005错误,提示error reading file simple.earth file not handled
    QT-找开工程后,最上方提示the code model could not parse an included file, which might lead to incorrect code completion and highlighting, for example.
    我的书《Unity3D动作游戏开发实战》出版了
    java中无符号类型的第三方库jOOU
    Windows批处理备份mysql数据
    使用 DevTools 时,通用Mapper经常会出现 class x.x.A cannot be cast to x.x.A
    Java版本,Java版本MongoDB驱动,驱动与MongoDB数据库,Spring之间的兼容性
    Jrebel本地激活方法
    wget下载指定网站目录下的所有内容
  • 原文地址:https://www.cnblogs.com/flylong0204/p/4331349.html
Copyright © 2011-2022 走看看