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

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

注意事项

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

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

     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 }

时间: 2025-01-20 04:42:38

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

enum枚举类型的定义

enum枚举类型的定义方式与某种用法 #include <iostream> using namespace std; int main() { enum TOT{ zero, one, two, three, four, five };//0,1,2,3,4,5 TOT to1; to1 = five; switch (to1) { case 0:cout << "zero\n"; break; case 1:cout << "one\n

用enum枚举量做下标初始化数组

一下copy自:http://bbs.csdn.net/topics/90234659 ------------------------------------------------------------------------------------------------------------------- “两则C语言技巧”http://tb.blog.csdn.net/TrackBack.aspx?PostId=1120124第一个技巧在我的环境下不能通过,是我的原因吗.引用:1.

C 开发学习 - 结构类型(枚举/结构/类型定义)

一.枚举 定义:枚举是 一种用户定义的数据类型,它用的关键字 enum 枚举类型名字通常并不真的使用,要用的是在大括号里地名字,因为它们就是常量符合,它们的类型是int,值则依次从0到n. enum colors {red, yellow, green} 语法:enum 枚举类型名称{名字0m, ..., 名字n}; 案例一:自动计数的枚举 // // main.c // enum // // Created by liuxinming on 15/4/26. // Copyright (c)

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

--------------------------------------------------------------------- 枚举: // main.c #include <stdio.h> const int red = 0; const int yellow = 1; const int green = 2; int main(int argc, const char * argv[]) { /* 常量符号化:用符号而不是具体的数字来表示程序中的数字; 这样看到符号才能知道背

Enum枚举

Java Enum原理 public enum Size{ SMALL, MEDIUM, LARGE, EXTRA_LARGE }; 实际上,这个声明定义的类型是一个类,它刚好有四个实例,在此尽量不要构造新对象. 因此,在比较两个枚举类型的值时,永远不需要调用equals方法,而直接使用"=="就可以了.(equals()方法也是直接使用==,  两者是一样的效果) Java Enum类型的语法结构尽管和java类的语法不一样,应该说差别比较大.但是经过编译器编译之后产生的是一个cla

java Enum 枚举

看了点东西,发现对java枚举不是很了解,然后就找找看看记记了. 为什么要用枚举呢?枚举再jdk1.5之前是没有的,1.5之后java才支持枚举.为什么要用枚举呢? 如果一个变量只有几种可能的值,这时候我们可以用int.String或者其他类型的变量来表示,虽然可以这样做但是,这样我们无法保证 使用时候的值一定是我们约定好几个值,这样就难免产生不必要的麻烦,而枚举就能避免这样的错误,枚举类型其实就是将变量的值一一列举出来, 变量的值只限于列举出来的值的范围内,一旦定义了枚举类型变量,那么该变量只

中秋佳节--理解Enum枚举

一.Enum枚举的作用 1.使用枚举可以限定取值范围,枚举中定义的每个常量都可以理解为对象: Eg: Public enum Color{ RED, GREEN,BULE; } 说明:RED实际上就表示的是枚举的名称,默认的编号是0,可以使用ordinal()方法获得. 2.使用enum关键字定义枚举类,其中包含的对象可以初始化定义(初始化构造函数) Eg: package cn.test.java.enums; enum ColorDemo{ RED("红色"),GREEN(&quo

Java enum枚举的用法

一. 出现背景: 在JDK1.5之前,我们定义常量是这样的:public static final String RED = "RED"; 在JDK1.5中加入了枚举类型,我们可以把相关的常量分组到一个枚举类中: public enum Color { RED, GREEN, BLUE; } 使用的时候可以这样:Color c = Color.RED 二. 枚举特点: 1. 枚举enum是一个特殊的Java类,它继承自java.lang.Enum,继承了很多Enum的方法.但枚举类是一

c#中枚举类型的定义与使用

介绍枚举是一个指定的常数,其基础类型可以是除 Char 外的任何整型.如果没有显式声明基础类型,则使用 Int32.编程语言通常提供语法来声明由一组已命名的常数和它们的值组成的枚举.定义默认基数从O开始,也可指定数值. enum Days { Saturday=1, Sunday, Monday, Tuesday, Wednesday, Thursday, Friday }; enum Colors { Red = 1, Green = 2, Blue = 4, Yellow = 8 }; 使用