一.枚举类型的定义:

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

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

二.宏定义与枚举类型:

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

#include #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 weekenum 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/* 定义枚举类型 */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 /* 定义枚举类型 */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 /* 定义枚举类型,同时声明该类型的三个变量,它们都为全局变量 */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 30printf("%d %d %d \n", yesterday, today, tomorrow);}

运行结果如下:

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

#include /* 定义枚举类型,同时声明该类型的三个变量,并赋初值。它们都为全局变量 */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 30printf("%d %d %d \n", yesterday, today, tomorrow); //输出:1 2 3}

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

#include 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 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 bytesprintf("%d bytes \n", sizeof(escapes)); //4 bytesprintf("%d bytes \n", sizeof(enum BOOLEAN)); //4 bytesprintf("%d bytes \n", sizeof(BOOLEAN)); //4 bytesprintf("%d bytes \n", sizeof(match_flag)); //4 bytesprintf("%d bytes \n", sizeof(SPACE)); //4 bytesprintf("%d bytes \n", sizeof(NEWLINE)); //4 bytesprintf("%d bytes \n", sizeof(FALSE)); //4 bytesprintf("%d bytes \n", sizeof(0)); //4 bytes}

八.综合示例:

#includeenum Season{spring, summer=100, fall=96, winter};typedef enum{Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday}Weekday;void main(){/* Season */printf("%d \n", spring); // 0printf("%d, %c \n", summer, summer); // 100, dprintf("%d \n", fall+winter); // 193Season mySeason=winter;if(winter==mySeason)printf("mySeason is winter \n"); // mySeason is winterint x=100;if(x==summer)printf("x is equal to summer\n"); // x is equal to summerprintf("%d bytes\n", sizeof(spring)); // 4 bytes/* Weekday */printf("sizeof Weekday is: %d \n", sizeof(Weekday)); //sizeof Weekday is: 4Weekday today = Saturday;Weekday tomorrow;if(today == Monday)tomorrow = Tuesday;elsetomorrow = (Weekday) (today + 1); //remember to convert from int to Weekday}

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

2023.01.25

From:努力进大厂的新青年