1.我们为什么要用枚举类型?
在很多程序中,我们需要部分变量具有某些特殊含义的值,例如布尔变量就具有两个值,非真即假。但是在实际运用中不是每种事物都只有两种取值,有的变量就可能有几种取值,并且每种取值都有其特殊含义。例如,扑克牌的的花色就有四种取值:“红桃”,“黑桃”,“梅花”,“方片”(♥️,♠️,♣️,♦️)。一个星期的星期几也有几种取值,“Monday”,“Tuesday”,“Wednesday”,“Thursday”,“Friday”,“Saturday”,“Sunday”(星期一,星期二,星期三,星期四,星期五,星期六,星期日)等。像这样的特殊一个变量里只包含一些常量的数据类型,就定义为枚举类型,所谓枚举是指将变量的值一一列举出来,变量只限于列举出来的值的范围内取值。
2.枚举类型的定义?
枚举类型的定义:
enum 枚举名{
枚举常量标识符[=整型常数],
枚举常量标识符[=整型常数],
...
枚举常量标识符[=整型常数]
} 枚举变量;
enum mon{Jan,Feb,Mar,Apr,May,June,July,Aug,Sep,Oct,Nov,Dec}m;
enum mon{Jan,Feb,Mar,Apr,May = 5,June,July,Aug,Sep,Oct,Nov,Dec = 12}m;
enum mon{Jan = 1,Feb,Mar,Apr,May,June,July,Aug,Sep,Oct,Nov,Dec}m;
我们只需要定义枚举中的第一个Jan = 1,后面的数不需要定义会自动递增1,所以枚举mon的取值同样是[1,12]。
3.枚举类型的使用。
(1)使用枚举类型,输入星期几的数字,查询对应的星期几的英文。
#include<stdio.h>
int main()
{
enum weekday {sun,mon,tue,wed,thu,fri,sat} day;
int w;
printf("input a number(0--6):");
scanf("%d",&w);
day=(enum weekday)w; //将整数赋值给枚举变量时要进行强制类型装换
switch(day)
{
case sun: printf("sunday\n");break;
case mon: printf("monday\n");break;
case tue: printf("tuesday\n");break;
case wed: printf("wednesday\n");break;
case thu: printf("thursday\n");break;
case fri: printf("friday\n");break;
case sat: printf("satday\n");break;
default: printf("input error\n");break;
}
return 0;
}
(2)枚举的综合使用,具体知识点见代码注释。
#include<stdio.h>
enum Season {spring, summer = 100, fall = 96, winter};
typedef enum {Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday} Weekday;
int main() {
printf("spring = %d\n", spring); // 输出spring自动初始化的整数值
printf("summer = %d\n", summer); // 输出summer被初始化为100的整数值
printf("summer + fall = %d \n", fall+winter); // 输出被初始化的summer + fall的整数值
enum Season mySeason = winter; // 使用枚举类型创建一个变量mySeason并赋初值winter
if(winter == mySeason)
printf("mySeason is winter\n"); // 证明枚举类型的比较实际是对应整数的比较1
int x = 100;
if(x == summer)
printf("x is equal to summer\n"); // 证明枚举类型的比较实际是对应整数的比较2
printf("%lu bytes\n", sizeof(spring)); // 证明枚举类型常量是一个整形
printf("sizeof Weekday is: %lu\n", sizeof(Weekday)); // 证明枚举变量是一个整形
/* 根据今天判断明天是星期几 */
Weekday today = Saturday;
Weekday tomorrow;
if(today == Monday)
tomorrow = Tuesday;
else
tomorrow = (Weekday) (today + 1);
return 0;
}
4.使用枚举类型的注意点。
(1)enum是关键字,标识枚举类型。定义枚举类型必须用enum开头。
(2)枚举数据表中的名字是程序员自己设定,这些名字只是一个符号。但注意命名时要提高程序的可读性。
(3)枚举数据表的值都是整数(默认从0开始每一次递增1)。
(4)可以在定义类型时对枚举常量初始化。
(5)枚举类型可以进行比较。
(6)枚举常量不是字符串,不能用%s方式输出字符串。
(7)因为枚举类型是常量,所以不能对枚举类型进行赋值运算。
(8) 将整数赋值给枚举变量时要进行强制类型装换。
(9) 枚举型是一个集合,集合中的元素(枚举成员)是一些命名的整型常量,元素之间用逗号,隔开。
(10) 同一个程序中不能定义同名的枚举类型,不同的枚举类型中也不能存在同名的命名常量。