跨境派

跨境派

跨境派,专注跨境行业新闻资讯、跨境电商知识分享!

当前位置:首页 > 卖家故事 > C语言枚举类型enum(全面详细直观)

C语言枚举类型enum(全面详细直观)

时间:2024-04-10 07:05:24 来源:网络cs 作者:往北 栏目:卖家故事 阅读:

标签: 详细  直观  枚举  类型  语言 
阅读本书更多章节>>>>

一.枚举类型的定义:

维基百科的理解:枚举类型用于声明一组命名的常数,当一个变量有几种可能的取值时,可以将它定义为枚举类型。 定义:是指将变量的值一一列出来,变量的值只限于列举出来的值的范围内。

我的理解:枚举类型就是将一些比较固定的值一一列举出来,比如一年有十二个月,一个礼拜有七天,这是毫无疑问的,就可以将这些月份天数用常量来代替。枚举类型和宏定义是差不多的,只有细微区别,宏运行是在预处理阶段完成的,枚举类型是在与编译阶段完成的。

二.宏定义与枚举类型:

我们先用宏定义来引出枚举常量,并且说明两者的有缺点,请看下面代码:

#include <stdio.h>#define Mon 1#define Tues 2#define Wed 3#define Thurs 4#define Fri 5#define Sat 6#define Sun 7int main(){    int day;    scanf("%d", &day);    switch(day){        case Mon: puts("Monday"); break;        case Tues: puts("Tuesday"); 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;}

运行结果:

5Friday

#define命令虽然能解决问题,但也带来了不小的副作用,宏名多,代码离散,可读性低,不能一次性解决问题。这时,C语言提供了一种枚举(Enum)类型,能够列出所有可能的取值,并给它们取一个名字。

枚举的定义格式如下:

enum 枚举名{    枚举值表    value1,value2,value3......};

在枚举值表中应罗列出所有可用值。这些值也称为枚举元素。

enum是一个新的关键字,专门用来定义枚举类型,这也是它在C语言中的唯一用途;枚举名(是一个标识符)是枚举类型的名字;value1, value2, value3, ......是每个值对应的名字的列表。注意最后的;不能少,枚举类型里面的枚举值默认是从0开始往后递增的.(如果第一个值被设为1,则默认从1开始递增)。

例如,列出一个星期有几天:

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

可以看到,我们仅仅给出了名字,却没有给出名字对应的值,这是因为枚举值默认从 0 开始,往后逐个加 1(递增);也就是说,week 中的 Mon、Tues ...... Sun 对应的值分别为 0、1 ...... 6。

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

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

因为枚举值是默认从第一个的值开始递增的,所以以上代码还有一种更简洁的代码写法2:

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

三.使用枚举类型对变量声明的几种方式:

1.枚举类型的定义和变量的声明分开:

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

2. 类型定义与变量声明同时进行:

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

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

typedef enum workday{    saturday,    sunday = 0,    monday,    tuesday,    wednesday,    thursday,    friday} workday; //此处的workday为枚举型enum workday的别名int main(){    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//以上两种方式相同

注意: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{    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;

五.使用枚举类型的变量:

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 \n", yesterday, today, tomorrow);}

运行结果如下:

2.声明变量时同时赋值:

#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 \n", yesterday, today, tomorrow);}

运行结果如下:

3.定义类型的同时声明变量,然后对变量赋值:

#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 \n", x, y, z); //输出:10 20 30    printf("%d %d %d \n", yesterday, today, tomorrow);}

运行结果如下:

4.类型定义,变量声明,赋初值同时进行:

#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 \n", x, y, z); //输出:10 20 30    printf("%d %d %d \n", yesterday, today, tomorrow); //输出:1 2 3}

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

#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 \n", yesterday, today, tomorrow); //输出:2 3 30}

七.枚举变量的大小(sizeof):

#include <stdio.h>enum escapes{     BELL      = '\a',    BACKSPACE = '\b',    HTAB      = '\t',    RETURN    = '\r',    NEWLINE   = '\n',     VTAB      = '\v',    SPACE     = ' '};enum BOOLEAN { FALSE = 0, TRUE } match_flag;void main(){    printf("%d bytes \n", sizeof(enum escapes)); //4 bytes    printf("%d bytes \n", sizeof(escapes)); //4 bytes    printf("%d bytes \n", sizeof(enum BOOLEAN)); //4 bytes    printf("%d bytes \n", sizeof(BOOLEAN)); //4 bytes    printf("%d bytes \n", sizeof(match_flag)); //4 bytes    printf("%d bytes \n", sizeof(SPACE)); //4 bytes    printf("%d bytes \n", sizeof(NEWLINE)); //4 bytes    printf("%d bytes \n", sizeof(FALSE)); //4 bytes    printf("%d bytes \n", sizeof(0)); //4 bytes}

八.综合示例:

#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 \n", spring); // 0    printf("%d, %c \n", summer, summer); // 100, d    printf("%d \n", fall+winter); // 193    Season mySeason=winter;    if(winter==mySeason)        printf("mySeason is winter \n"); // mySeason is winter        int x=100;    if(x==summer)        printf("x is equal to summer\n"); // x is equal to summer    printf("%d bytes\n", sizeof(spring)); // 4 bytes    /* Weekday */    printf("sizeof Weekday is: %d \n", 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}

下一篇文章将会和大家分享一下联合体期待大家关注,关注。

2023.01.25

From:努力进大厂的新青年

阅读本书更多章节>>>>

本文链接:https://www.kjpai.cn/gushi/2024-04-10/156320.html,文章来源:网络cs,作者:往北,版权归作者所有,如需转载请注明来源和作者,否则将追究法律责任!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。

文章评论