zoukankan      html  css  js  c++  java
  • 枚举简单介绍(转)

    注:以下全部代码的执行环境为VC++ 6.0

    在程序中,可能需要为某些整数定义一个别名,我们可以利用预处理指令#define来完成这项工作,您的代码可能是:

    复制代码
    #define MON  1
    #define TUE   2
    #define WED  3
    #define THU   4
    #define FRI    5
    #define SAT   6
    #define SUN   7
    复制代码

    在此,我们定义一种新的数据类型,希望它能完成同样的工作。这种新的数据类型叫枚举型。

    1. 定义一种新的数据类型 - 枚举型

     以下代码定义了这种新的数据类型 - 枚举型

    enum DAY
    {
          MON=1, TUE, WED, THU, FRI, SAT, SUN
    };

    (1) 枚举型是一个集合,集合中的元素(枚举成员)是一些命名的整型常量,元素之间用逗号,隔开。

    (2) DAY是一个标识符,可以看成这个集合的名字,是一个可选项,即是可有可无的项。

    (3) 第一个枚举成员的默认值为整型的0,后续枚举成员的值在前一个成员上加1。

    (4) 可以人为设定枚举成员的值,从而自定义某个范围内的整数。

    (5) 枚举型是预处理指令#define的替代。

    (6) 类型定义以分号;结束。

    2. 使用枚举类型对变量进行声明

    新的数据类型定义完成后,它就可以使用了。我们已经见过最基本的数据类型,如:整型int, 单精度浮点型float, 双精度浮点型double, 字符型char, 短整型short等等。用这些基本数据类型声明变量通常是这样:

    复制代码
    char     a; //变量a的类型均为字符型char
    char     letter;
    int        x,
               y,
               z; //变量x,y和z的类型均为整型int
    int       number;
    double  m, n;
    double  result; //变量result的类型为双精度浮点型double
    复制代码

    既然枚举也是一种数据类型,那么它和基本数据类型一样也可以对变量进行声明。

    方法一:枚举类型的定义和变量的声明分开

    enum DAY
    {
          MON=1, TUE, WED, THU, FRI, SAT, SUN
    };
    enum DAY yesterday;
    enum DAY today;
    enum DAY tomorrow; //变量tomorrow的类型为枚举型enum DAY
    enum DAY good_day, bad_day; //变量good_day和bad_day的类型均为枚举型enum DAY

    方法二:类型定义与变量声明同时进行:

    复制代码
    enum //跟第一个定义不同的是,此处的标号DAY省略,这是允许的。
    {
        saturday,
        sunday = 0,
        monday,
        tuesday,
        wednesday,
        thursday,
        friday
    } workday; //变量workday的类型为枚举型enum DAY
    复制代码
    enum week { Mon=1, Tue, Wed, Thu, Fri Sat, Sun} days; //变量days的类型为枚举型enum week
    enum BOOLEAN { false, true } end_flag, match_flag; //定义枚举类型并声明了两个枚举型变量

    方法三:用typedef关键字将枚举类型定义成别名,并利用该别名进行变量声明:

    复制代码
    typedef enum workday
    {
        saturday,
        sunday = 0,
        monday,
        tuesday,
        wednesday,
        thursday,
        friday
    } workday; //此处的workday为枚举型enum workday的别名
    复制代码
    workday today, tomorrow; //变量today和tomorrow的类型为枚举型workday,也即enum workday

    enum workday中的workday可以省略:

    复制代码
    typedef enum
    {
        saturday,
        sunday = 0,
        monday,
        tuesday,
        wednesday,
        thursday,
        friday
    } workday; //此处的workday为枚举型enum workday的别名

    workday today, tomorrow; //变量today和tomorrow的类型为枚举型workday,也即enum workday
    复制代码

    也可以用这种方式:

    复制代码
    typedef enum workday
    {
        saturday,
        sunday = 0,
        monday,
        tuesday,
        wednesday,
        thursday,
        friday
    };

    workday today, tomorrow; //变量today和tomorrow的类型为枚举型workday,也即enum workday
    复制代码

    注意:同一个程序中不能定义同名的枚举类型,不同的枚举类型中也不能存在同名的命名常量。错误示例如下所示:

    错误声明一:存在同名的枚举类型

    复制代码
    typedef enum
    {
        wednesday,
        thursday,
        friday
    } workday;

    typedef enum WEEK
    {
        saturday,
        sunday = 0,
        monday,
    } workday;
    复制代码

    错误声明二:存在同名的枚举成员

    复制代码
    typedef enum
    {
        wednesday,
        thursday,
        friday
    } workday_1;

    typedef enum WEEK
    {
        wednesday,
        sunday = 0,
        monday,
    } workday_2;
    复制代码

    3. 使用枚举类型的变量

    3.1 对枚举型的变量赋值。

    实例将枚举类型的赋值与基本数据类型的赋值进行了对比:

    方法一:先声明变量,再对变量赋值

    复制代码
    #include<stdio.h>

    /* 定义枚举类型 */
    enum DAY { MON=1, TUE, WED, THU, FRI, SAT, SUN };

    void main()
    {
        /* 使用基本数据类型声明变量,然后对变量赋值 */
        int x, y, z;
        
        x = 10;
        y = 20;
        z = 30;
        
        /* 使用枚举类型声明变量,再对枚举型变量赋值 */
        enum DAY yesterday, today, tomorrow;
        
        yesterday = MON;
        today     = TUE;
        tomorrow  = WED;

        printf("%d %d %d  ", yesterday, today, tomorrow);
    }
    复制代码

    方法二:声明变量的同时赋初值

    复制代码
    #include <stdio.h>

    /* 定义枚举类型 */
    enum DAY { MON=1, TUE, WED, THU, FRI, SAT, SUN };

    void main()
    {
        /* 使用基本数据类型声明变量同时对变量赋初值 */
        int x=10, y=20, z=30;

        /* 使用枚举类型声明变量同时对枚举型变量赋初值 */
        enum DAY yesterday = MON, 
                            today = TUE,
                       tomorrow = WED;

        printf("%d %d %d  ", yesterday, today, tomorrow);
    }
    复制代码

    方法三:定义类型的同时声明变量,然后对变量赋值。

    复制代码
    #include <stdio.h>

    /* 定义枚举类型,同时声明该类型的三个变量,它们都为全局变量 */
    enum DAY { MON=1, TUE, WED, THU, FRI, SAT, SUN } yesterday, today, tomorrow;

    /* 定义三个具有基本数据类型的变量,它们都为全局变量 */
    int x, y, z;

    void main()
    {
        /* 对基本数据类型的变量赋值 */
        x = 10;  y = 20;  z = 30;
        
        /* 对枚举型的变量赋值 */
        yesterday = MON;
        today     = TUE;
        tomorrow  = WED;

        printf("%d %d %d  ", x, y, z); //输出:10 20 30
        printf("%d %d %d  ", yesterday, today, tomorrow); //输出:1 2 3
    }
    复制代码

    方法四:类型定义,变量声明,赋初值同时进行。

    复制代码
    #include <stdio.h>

    /* 定义枚举类型,同时声明该类型的三个变量,并赋初值。它们都为全局变量 */
    enum DAY
    {
        MON=1, 
        TUE,
        WED,
        THU,
        FRI,
        SAT,
        SUN 
    }
    yesterday = MON, today = TUE, tomorrow = WED;

    /* 定义三个具有基本数据类型的变量,并赋初值。它们都为全局变量 */
    int x = 10, y = 20, z = 30;

    void main()
    {
        printf("%d %d %d  ", x, y, z); //输出:10 20 30
        printf("%d %d %d  ", yesterday, today, tomorrow); //输出:1 2 3
    }
    复制代码

    3.2 对枚举型的变量赋整数值时,需要进行类型转换

    复制代码
    #include <stdio.h>

    enum DAY { MON=1, TUE, WED, THU, FRI, SAT, SUN };

    void main()
    {
        enum DAY yesterday, today, tomorrow;

        yesterday = TUE;
        today = (enum DAY) (yesterday + 1); //类型转换
        tomorrow = (enum DAY) 30; //类型转换
        //tomorrow = 3; //错误

        printf("%d %d %d  ", yesterday, today, tomorrow); //输出:2 3 30
    }
    复制代码

    3.3 使用枚举型变量

    复制代码
    #include<stdio.h>

    enum

        BELL          = 'a',
        BACKSPACE = '',
        HTAB         = ' ',
        RETURN      = ' ',
        NEWLINE    = ' ', 
        VTAB         = 'v',
        SPACE       = ' '
    };

    enum BOOLEAN { FALSE = 0, TRUE } match_flag;

    void main()
    {
        int index = 0;
        int count_of_letter = 0;
        int count_of_space = 0;

        char str[] = "I'm Ely efod";

        match_flag = FALSE;

        for(; str[index] != ''; index++)
            if( SPACE != str[index] )
                count_of_letter++;
            else
            {
                match_flag = (enum BOOLEAN) 1;
                count_of_space++;
            }
        
        printf("%s %d times %c", match_flag ? "match" : "not match", count_of_space, NEWLINE);
        printf("count of letters: %d %c%c", count_of_letter, NEWLINE, RETURN);
    }
    复制代码

    输出:
    match 2 times
    count of letters: 10
    Press any key to continue

    4. 枚举类型与sizeof运算符

    复制代码
    #include <stdio.h>

    enum escapes

        BELL      = 'a',
        BACKSPACE = '',
        HTAB      = ' ',
        RETURN    = ' ',
        NEWLINE   = ' ', 
        VTAB      = 'v',
        SPACE     = ' '
    };

    enum BOOLEAN { FALSE = 0, TRUE } match_flag;

    void main()
    {
        printf("%d bytes  ", sizeof(enum escapes)); //4 bytes
        printf("%d bytes  ", sizeof(escapes)); //4 bytes

        printf("%d bytes  ", sizeof(enum BOOLEAN)); //4 bytes
        printf("%d bytes  ", sizeof(BOOLEAN)); //4 bytes
        printf("%d bytes  ", sizeof(match_flag)); //4 bytes

        printf("%d bytes  ", sizeof(SPACE)); //4 bytes
        printf("%d bytes  ", sizeof(NEWLINE)); //4 bytes
        printf("%d bytes  ", sizeof(FALSE)); //4 bytes
        printf("%d bytes  ", sizeof(0)); //4 bytes
    }
    复制代码

    5. 综合举例

    复制代码
    #include<stdio.h>

    enum Season
    {
        spring, summer=100, fall=96, winter
    };

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

    void main()
    {
        /* Season */
        printf("%d  ", spring); // 0
        printf("%d, %c  ", summer, summer); // 100, d
        printf("%d  ", fall+winter); // 193

        Season mySeason=winter;
        if(winter==mySeason)
            printf("mySeason is winter  "); // mySeason is winter
        
        int x=100;
        if(x==summer)
            printf("x is equal to summer "); // x is equal to summer

        printf("%d bytes ", sizeof(spring)); // 4 bytes

        /* Weekday */
        printf("sizeof Weekday is: %d  ", sizeof(Weekday)); //sizeof Weekday is: 4

        Weekday today = Saturday;
        Weekday tomorrow;
        if(today == Monday)
            tomorrow = Tuesday;
        else
            tomorrow = (Weekday) (today + 1); //remember to convert from int to Weekday
    }
    复制代码
  • 相关阅读:
    eslint 的 env 配置是干嘛使的?
    cookie httpOnly 打勾
    如何定制 antd 的样式(theme)
    剑指 Offer 66. 构建乘积数组
    剑指 Offer 65. 不用加减乘除做加法
    剑指 Offer 62. 圆圈中最后剩下的数字
    剑指 Offer 61. 扑克牌中的顺子
    剑指 Offer 59
    剑指 Offer 58
    剑指 Offer 58
  • 原文地址:https://www.cnblogs.com/wangmenghan/p/5369337.html
Copyright © 2011-2022 走看看