0
点赞
收藏
分享

微信扫一扫

计算机科学类专升本复习之“C语言枚举类型”详解(初稿)

C语言枚举类型(C语言enum用法)详解

在实际开发中,有些数据的"取值"往往是有限的,只能是非常少量的整数,并且最好为每个值都取一个名字,以方便使用。

比如一个星期只有七天,一年只有十二个月等

接下来咱们以"每周七天"为例,我们可以使用 #define 命令来给每天指定一个名字

#include<stdio.h>

#define Mon 1

#define Tues 2

#define Wed 3

#define Thurs 4

#define Fri 5

#define Sat 6

#define Sun 7

int main()

{

    int day;

    scanf("%d",

    switch(day)

    {

        case Mon :

            puts("Monday");

            break;



        case Tues :

            puts("Tueday");

            break;



        case Wed :

            puts("Wednesday");

            break;



        case Thurs :

            puts("Thursday");

            break;



        case Fri :

            puts("Friday");

            break;



        case Sat:

            puts("Saturday");

            break;



        case Sun:

            puts("Sunday");

            break;

       

        default:

            puts("Error!");

    }

    return 0;

}

结果:

5↙

Friday


 

#define 命令虽然能解决问题,但是太麻烦了,宏名过多,看起来也不舒服

这时候C语言提供了一种能够 列出所处可能取值的类型 它就是 "枚举类型"

定义形式为:

    enum typeName{

        valueName1,

        valueName2,

        .......

    };

enum 是一个新的 关键字,专门用来定义"枚举类型"

这也是它在C语言的"唯一用途".

typeName枚举类型的名字

valueName1, valueName2, valueName3, ......每个值对应的名字的列表。注意最后的 ; 不能少

//例如列出一个星期有几天

enum week{Mon,Tues,Wed,Thurs,Fri,Sat,Sun};

我们可以看到,我们仅仅给出了名字,但没有给除名字对应的值

这是因为 枚举类型默认从0开始,往后这个加1(递增)

也就是说week中的Mon、Tues... Sun 对应的值分别是0、1 .... 6

我们也可以给每个名字都指定一个值:

enum wekk{Mon = 1, Tues = 2, Wed = 3,Thurs = 4,Fri =5,Sat = 6,Sun = 7};

更为简单的方法是只给第一个名字指定值

enum week{ Mon = 1, Tues, Wed, Thurs, Fri, Sat, Sun };

枚举是一种类型通过它可以定义枚举变量

enum week a, b, c;

也可以在定义枚举类型同时定义变量

enum week{ Mon = 1, Tues, Wed, Thurs, Fri, Sat, Sun } a, b, c;

有了枚举变量,就可以把列表中的值赋给它

enum week{ Mon = 1, Tues, Wed, Thurs, Fri, Sat, Sun };

enum week a = Mon, b = Wed, c = Sat;

写个程序加深理解吧:

//判断用户输入的是星期几。

#include<stdio.h>

int main()

{

    enum wekkP{Mon = 1, Tues,Wed,Thurs,Fri,Sat,Sun}day;

    scanf("%d",

    switch(day)

    {

        case Mon:

            puts("Monday");

            break;

       

        case Tues:

            puts("Tuesday");

            break;



        case Wed:

            puts("Wedneday");

            break;



        case Thurs:

            puts("Thursday");

            break;



        case Fri:

            puts("Friday");

            break;



        case Sat:

            puts("Saturday");

            break;



        case Sun:

            puts("Sunday");

            break;



        default:

            puts("Error!");

    }

    return 0;

}

结果:

4↙

Thursday

需要注意的两点是:

1. 枚举列表中的 Mon、Tues、Wed 这些标识符的作用范围是"全局"的(严格来说是main()函数内部),不能再定义与它们名字相同的变量。

2. Mon、Tues、Wed灯关都是常量,不能对它们"赋值",只能将它们赋值给其他变量。

枚举其实非常相似: 宏在"预处理阶段"将名字替换成对应的值,枚举在"编译阶段"将名字替换成对应的值。

我们可以将枚举理解为"编译阶段的宏"

//对于上面的代码,在编译的某个时刻会变成类似下面的样子:

#include <stdio.h>

int main(){

    enum week{ Mon = 1, Tues, Wed, Thurs, Fri, Sat, Sun } day;

    scanf("%d",

    switch(day){

        case 1: puts("Monday"); break;

        case 2: puts("Tuesday"); break;

        case 3: puts("Wednesday"); break;

        case 4: puts("Thursday"); break;

        case 5: puts("Friday"); break;

        case 6: puts("Saturday"); break;

        case 7: puts("Sunday"); break;

        default: puts("Error!");

    }

    return 0;

}

Mon、Tues、Wed 这些名字都被替换成了对应的数字。这意味着,Mon、Tues、Wed 等都不是变量,它们不占用数据区(常量区、全局数据区、栈区和堆区)的内存,而是直接被编译到命令里面,放到代码区,所以不能用&取得它们的地址。这就是枚举的本质。

case 关键字必须是一个整数,或者是结果为整数表达式,但不能包含任何变量,正是由于 Mon、Tues、Wed 这些名字最终会被替换成一个整数,所以它们才能放在 case 后面。

枚举类型变量需要存放的是一个整数,我猜测它的长度和 int 应该相同,下面来验证一下:

#include <stdio.h>

int main(){

    enum week{ Mon = 1, Tues, Wed, Thurs, Fri, Sat, Sun } day = Mon;

    printf("%d, %d, %d, %d, %d\n", sizeof(enum week), sizeof(day), sizeof(Mon), sizeof(Wed), sizeof(int) );

    return 0;

}

结果:

4, 4, 4, 4, 4

举报

相关推荐

0 条评论