美文网首页C语言基础学习
《C语言13—枚举》

《C语言13—枚举》

作者: 竹予青青 | 来源:发表于2019-03-18 21:16 被阅读22次

    2019年3月18日星期一 阴

    (声明:理论知识部分来自菜鸟教程网站!)
    今日学习内容:

    20、C enum(枚举)

    枚举是 C 语言中的一种基本数据类型,它可以让数据更简洁,更易读。

    枚举语法定义格式为:

    enum 枚举名 {枚举元素1,枚举元素2,……};

    接下来我们举个例子,比如:一星期有 7 天,如果不用枚举,我们需要使用 #define 来为每个整数定义一个别名:

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

    这个看起来代码量就比较多,接下来我们看看使用枚举的方式:

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

    这样看起来是不是更简洁了。

    注意:第一个枚举成员的默认值为整型的 0,后续枚举成员的值在前一个成员上加 1。我们在这个实例中把第一个枚举成员的值定义为 1,第二个就为 2,以此类推。

    可以在定义枚举类型时改变枚举元素的值:

    enum season {spring, summer=3, autumn, winter};

    没有指定值的枚举元素,其值为前一元素加 1。也就说 spring 的值为 0,summer 的值为 3,autumn 的值为 4,winter 的值为 5

    (1) 枚举变量的定义

    前面我们只是声明了枚举类型,接下来我们看看如何定义枚举变量。
    我们可以通过以下三种方式来定义枚举变量:

    a.先定义枚举类型,再定义枚举变量

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

    b.定义枚举类型的同时定义枚举变量

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

    c.省略枚举名称,直接定义枚举变量

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

    实例

    #include<stdio.h>
     
    enum DAY
    {
          MON=1, TUE, WED, THU, FRI, SAT, SUN
    };
     
    int main()
    {
        enum DAY day;
        day = WED;
        printf("%d",day);
        return 0;
    }
    

    以上实例输出结果为:

    3

    在C 语言中,枚举类型是被当做 int 或者 unsigned int 类型来处理的,所以按照 C 语言规范是没有办法遍历枚举类型的。

    不过在一些特殊的情况下,枚举类型必须连续是可以实现有条件的遍历。

    以下实例使用 for 来遍历枚举的元素:
    实例

    #include<stdio.h>
     
    enum DAY
    {
          MON=1, TUE, WED, THU, FRI, SAT, SUN
    } day;
    int main()
    {
        // 遍历枚举元素
        for (day = MON; day <= SUN; day++) {
            printf("枚举元素:%d \n", day);
        }
    }
    

    以上实例输出结果为:

    枚举元素:1
    枚举元素:2
    枚举元素:3
    枚举元素:4
    枚举元素:5
    枚举元素:6
    枚举元素:7

    !!以上内容是来自“菜鸟教程
    A. 但是这里有一个疑问就是,我把程序原封不动放在vs2017里面,发现for循环里面的++报错,且程序无法编译。
    程序中的错误提示是:“枚举类型上的此操作需要适用于用户定义的运算符函数”
    输出框的错误提示是:1>f:\code_c\first_program\first_program\enum.c(1): fatal error C1853: “Debug\first_program.pch”预编译头文件来自编译器的早期版本,或者预编译头为 C++ 而在 C 中使用它(或相反)

    B. 万能的百度,百度之后才知,enum类型终究不是int类型,根据上下文,for循环语句中的++用于构造类型数据需要重载。所以总结就是枚举类型最好不要使用++运算。

    C. 对于上述问题,有两种解决方式:
    是将day从enum里面提出来,自己定义成int型然后进行++运算,如图1 所示;
    是把day定义在enum里面,然后将“day++”运算改成“day=DAY((int)day+1)”,如图2所示。

    D. 这里还有一个就是如果将day放在enum里面定义,那么强制类型转换后进行++运算也是不行的,也就是(int)day++也是不行的。

    E.补充帮助理解:要理解一下enum也是一种类型,和int是同一个级别,存储起来和int类型是一样的。而且这里的day不能既在enum里面定义一次,又将其再定义一次成为int,不能重复定义。

    图1
    
    #include<stdio.h>
    
    enum DAY
    {
        MON = 1, TUE, WED, THU, FRI, SAT, SUN
    } ;
    int main()
    {
        int day;
        // 遍历枚举元素
        for (day = MON; day <= SUN; day++)
        {
            printf("枚举元素:%d \n", day);
        }
    }
    
    图2
    #include "pch.h"
    
    #include<stdio.h>
    
    enum DAY
    {
        MON = 1, TUE, WED, THU, FRI, SAT, SUN
    } day;
    int main()
    {
        int day;
        // 遍历枚举元素
        for (day = MON; day <= SUN; day = DAY((int)day + 1))
        {
            printf("枚举元素:%d \n", day);
        }
    }
    

    (需要注意一点的是,以上程序中的 #include "pch.h" 语句在vs2017里面是不能去掉的,否则程序会无法运行。)

    以下枚举类型不连续,这种枚举无法遍历。

    enum
    {
        ENUM_0,
        ENUM_10 = 10,
        ENUM_11
    };
    

    枚举在 switch 中的使用:
    实例

    #include <stdio.h>
    #include <stdlib.h>
    int main()
    {
     
        enum color { red=1, green, blue };
     
        enum  color favorite_color;
     
        /* ask user to choose color */
        printf("请输入你喜欢的颜色: (1. red, 2. green, 3. blue): ");
        scanf("%d", &favorite_color);
     
        /* 输出结果 */
        switch (favorite_color)
        {
        case red:
            printf("你喜欢的颜色是红色");
            break;
        case green:
            printf("你喜欢的颜色是绿色");
            break;
        case blue:
            printf("你喜欢的颜色是蓝色");
            break;
        default:
            printf("你没有选择你喜欢的颜色");
        }
     
        return 0;
    }
    

    以上实例输出结果为:

    请输入你喜欢的颜色: (1. red, 2. green, 3. blue): 1
    你喜欢的颜色是红色

    是的,菜鸟教程这里的例程,意料之中地,又出问题了。程序运行不了。原因是因为在c++中,默认scanf是不safe的,so把这里的scanf改成scanf_s就好啦!”

    (2)将整数转换为枚举

    以下实例将整数转换为枚举:
    实例

    #include <stdio.h>
    #include <stdlib.h>
     
    int main()
    {
     
        enum day
        {
            saturday,
            sunday,
            monday,
            tuesday,
            wednesday,
            thursday,
            friday
        } workday;
     
        int a = 1;
        enum day weekend;
        weekend = ( enum day ) a;  //类型转换
        //weekend = a; //错误
        printf("weekend:%d",weekend);
        return 0;
    }
    

    以上实例输出结果为:

    weekend:1


    Weif
    2019年3月18日

    相关文章

      网友评论

        本文标题:《C语言13—枚举》

        本文链接:https://www.haomeiwen.com/subject/itmvmqtx.html