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

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

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

注意事项

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

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

     #include <iostream>
    
     enum WeekType
    {
    Sun =,
    Mon =,
    Tue,
    }; void CallWeek(WeekType wk)
    {
    switch(wk)
    {
    case Sun:
    std::cout<<"周一......"<<std::endl;
    break;
    case Mon:
    std::cout<<"周二......" <<std::endl;
    break;
    case Tue:
    std::cout<<"周三......" <<std::endl;
    break;
    default:
    std::cout<<"Waring......" <<std::endl;
    break;
    } } int main(int argc,char **argv)
    {
    WeekType iWk=WeekType::Mon;
    int a =WeekType::Tue; switch(a)
    {
    case :
    std::cout<<"周一......"<<std::endl;
    break;
    case :
    std::cout<<"周二......" <<std::endl;
    break;
    case :
    std::cout<<"周三......" <<std::endl;
    break;
    default:
    std::cout<<"Waring......" <<std::endl;
    break;
    } CallWeek(iWk); return ;
    }

C/C++:[2]enum-枚举量声明、定义和使用的更多相关文章

  1. C++之enum枚举量声明、定义、使用与枚举类详解

    C++之enum枚举量声明.定义.使用与枚举类详解 学习一个东西,首先应该指导它能做什么,其次去知道它怎么去做,最后知道为什么去这么做. 知其然知其所以然.不能冒进 ,一步一步的慢慢来.

  2. 【C/C++开发】C++之enum枚举量声明、定义、使用与枚举类详解与枚举类前置类型声明

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

  3. enum枚举类型的定义

    enum枚举类型的定义方式与某种用法 #include <iostream> using namespace std; int main() { enum TOT{ zero, one, ...

  4. Enum 枚举类

    目录 Enum 枚举类 基础 定义与用途 基本方法 示例 进阶 实现原理 枚举与Class对象 自定义枚举类和构造方法及toString() Enum中使用抽象方法来实现枚举实例的多态性 Enum与接 ...

  5. [C语言]进阶|结构类型: 枚举, 结构, 类型定义

    --------------------------------------------------------------------- 枚举: // main.c #include <std ...

  6. C enum(枚举)

    C enum(枚举) 枚举是 C 语言中的一种基本数据类型,它可以让数据更简洁,更易读. 枚举语法定义格式为: enum 枚举名 {枚举元素1,枚举元素2,……}; 接下来我们举个例子,比如:一星期有 ...

  7. C#的Enum——枚举

    枚举 枚举类型声明为一组相关的符号常数定义了一个类型名称.枚举用于“多项选择”场合,就是程序运行时从编译时已经设定的固定数目的“选择”中做出决定. 枚举类型(也称为枚举)为定义一组可以赋给变量的命名整 ...

  8. C语言--enum,typedef enum 枚举类型详解

    原文:http://z515256164.blog.163.com/blog/static/32443029201192182854300/ 有改动 C语言详解 - 枚举类型 注:以下全部代码的执行环 ...

  9. 1.0 基础、标示符、常量、数据类型(enum 枚举,struct 结构体)、操作符、循环、数组

    一.程序 现实生活中,程序是指完成某些事务的一种既定方法和过程,可以把程序看成是一系列动作执行过程的描述. 在计算机世界,程序是指令,即为了让计算机执行某些操作或解决某个问题而编写的一系列有序指令的集 ...

随机推荐

  1. EMC DATA DOMAIN 2200 filesys destroy(數據清空及重建)

    EMC 數據清空 1.數據清空 這裡會清空file system的所有東西包括tapes

  2. MySQL5.7更改密码时出现ERROR 1054 (42S22): Unknown column 'password' in 'field list'

    转自:http://blog.csdn.net/u010603691/article/details/50379282 新安装的MySQL5.7,登录时提示密码错误,安装的时候并没有更改密码,后来通过 ...

  3. 国内大学毕业论文 LaTeX 模板集合

    西北工业大学学位论文LaTeX模板 http://code.google.com/p/nwputhesis/ 西北工业大学硕博士论文LaTeX模版 http://code.google.com/p/n ...

  4. r0遍历系统进程方法总结

    方法1: ZwQuerySystemInformation 这个方法网上一搜一大堆,不举例了 方法2:暴力枚举PID枚举进程,代码: NTSTATUS DriverEntry(PDRIVER_OBJE ...

  5. SQL2000/2005字符串拆分为列表通用函数

    ------------------------------------------------------------------ --  Author : htl258(Tony) --  Dat ...

  6. 计数排序-java

    今天看了一本书,书里有道题,题目很常见,排序,明了点说: 需求:输入:最多有n个正整数,每个数都小于n, n为107 ,没有重复的整数 输出:按升序排列 思路:假设有一组集合 {1,3,5,6,11, ...

  7. text()、html() 以及 val()的区别

    text() - 设置或返回所选元素的文本内容 html() - 设置或返回所选元素的内容(包括 HTML 标记) val() - 设置或返回表单字段的值 下面的例子演示如何通过 text().htm ...

  8. BestCoder Round #71 (div.2)

    数学 1001 KK's Steel 类似斐波那契求和 #include <cstdio> #include <cstring> #include <algorithm& ...

  9. SPFA+Dinic HDOJ 3416 Marriage Match IV

    题目传送门 题意:求A到B不同最短路的条数(即边不能重复走, 点可以多次走) 分析:先从A跑最短路,再从B跑最短路,如果d(A -> u) + w (u, v) + d (B -> v) ...

  10. LSM树由来、设计思想以及应用到HBase的索引

    讲LSM树之前,需要提下三种基本的存储引擎,这样才能清楚LSM树的由来: 哈希存储引擎  是哈希表的持久化实现,支持增.删.改以及随机读取操作,但不支持顺序扫描,对应的存储系统为key-value存储 ...