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
  • 相关阅读:
    Secure your iPhone with 6 digit passcode by upgrading to iOS9
    Threatening letter in Naver Line App
    Android Malware Analysis
    OGG目录清理数据
    RAC配置2个私网网卡使用HAIP服务
    sql调优脚本
    匿名内部类
    权限修饰符
    Android源码目录结构
    luffy项目:基于vue与drf前后台分离项目(1)
  • 原文地址:https://www.cnblogs.com/flylong0204/p/4331349.html
Copyright © 2011-2022 走看看