一.枚举类型的定义:
维基百科的理解:枚举类型用于声明一组命名的常数,当一个变量有几种可能的取值时,可以将它定义为枚举类型。 定义:是指将变量的值一一列出来,变量的值只限于列举出来的值的范围内。
我的理解:枚举类型就是将一些比较固定的值一一列举出来,比如一年有十二个月,一个礼拜有七天,这是毫无疑问的,就可以将这些月份天数用常量来代替。枚举类型和宏定义是差不多的,只有细微区别,宏运行是在预处理阶段完成的,枚举类型是在与编译阶段完成的。
二.宏定义与枚举类型:
我们先用宏定义来引出枚举常量,并且说明两者的有缺点,请看下面代码:
#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", &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; }
运行结果:
1. 5 2. Friday
#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 DAY int 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:努力进大厂的新青年