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. 攻城狮在路上(叁)Linux(十八)--- 文件系统的简单操作

    本篇仅作为补漏. 一.查看磁盘和目录的容量:df  du df:列出文件系统的整体磁盘使用量. du:评估文件系统的磁盘使用量(常用于评估目录所占容量) 二.连接文件:ln 1.hard link:硬 ...

  2. hdu 1517 博弈 **

    博弈题: 题意:2 个人玩游戏,从 1 开始,轮流对数进行累乘,直到超过一个指定的值. 解题思路:如果输入是 2 ~ 9 ,因为Stan 是先手,所以Stan 必胜如果输入是 10~18 ,因为Oll ...

  3. C语言中结构体的位域(bit-fields)

    转自:http://blog.sina.com.cn/s/blog_6240b5980100tcba.html 有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位.例如在存放一 ...

  4. Unity3d 提示 "The scripts file name does not match the name of the class defined in the script!"的解决办法

    有两个原因,一个是文件的名称和类名不一致 第二个原因是有命名空间, 排除应该是可以修复的

  5. 【rqnoj39】 饮食问题

    题目描述 Bessie 正在减肥,所以她规定每天不能吃超过 C (10 <= C <= 35,000)卡路里的食物.农民 John 在戏弄她,在她面前放了B (1 <= B < ...

  6. javase基础笔记1——简介和发展

    软件分为 系统软件 windows linux类 (unix)mac(麦金塔).数据库管理系统 unix linux 开源os(open source) 免费 开放 free os operation ...

  7. 全面解析windows下Memcache技术应用

    原文  http://www.cnblogs.com/liuqin520/p/4615644.html   一.Memcache介绍 Memcache 是 danga.com 的一个项目,最早是为 L ...

  8. java Clone使用方法详解

    java"指针"       Java语言的一个优点就是取消了指针的概念,但也导致了许多程序员在编程中常常忽略了对象与引用的区别,本文会试图澄清这一概念.并且由于Java不能 通过 ...

  9. 如何查看经过编码的cookie?

    方法1.去在线工具网站(http://tool.oschina.net/encode?type=2)手动复制编码的cookie,转码后查看. 方法2.用火狐浏览器打开网页,如果有历史记录(存在cook ...

  10. [技术学习]js接口继承

    js是面向对象语言,但是js又缺乏了面向对象的诸多特性,比如继承,没有接口继承也没有父类继承,因此有时候需要人工来实现继承. 一.首先看下java中面向对象的继承: //定义类鸟类的飞行动作 inte ...