什么是枚举
枚举顾名思义就是一一列举。
把可能的取值一一列举。
比如我们现实生活中:一周的星期一到星期日是有限的7天,可以一一列举性
性别有:男、女、保密,也可以一一列举
月份有12个月,也可以一一列举
三原色,也是可以意义列举
enum Day//星期
{
Mon,
Tues,
Wed,
Thur,
Fri,
Sat,
Sun
};
enum Sex//性别
{
MALE,
FEMALE,
SECRET
};
enum Color//颜⾊
{
RED,
GREEN,
BLUE
};
以上定义的enum Day
,enum Sex
,enum Color
都是枚举类型。
{}中的内容是枚举类型的可能取值,也叫枚举常量。
这些可能取值都是有值的,默认从0开始,依次递增1,当然在声明枚举类型的时候也可以赋初值。
enum Color//颜⾊
{
RED = 3,
GREEN,
BLUE,
YELLOW = 9,
BLACK
};
上述代码中,GREEN是4,BLUE是5,BLACK是10,没有赋初值的都是根据前面赋初值的默认递增1。
枚举类型的定义
前面我们只是声明了枚举类型,我们可以通过以下三种方式来定义枚举变量。
1、先定义枚举类型,再定义枚举变量
enum DAY
{
MON=1, TUE, WED, THU, FRI, SAT, SUN
};
enum DAY day;
2、定义枚举类型的同时定义枚举变量
enum DAY
{
MON=1, TUE, WED, THU, FRI, SAT, SUN
} day;
3、省略枚举名称,直接定义枚举变量
enum
{
MON=1, TUE, WED, THU, FRI, SAT, SUN
} day;
看一个实例:
#include <stdio.h>
enum DAY
{
MON=1, TUE, WED, THU, FRI, SAT, SUN
};
int main()
{
enum DAY day = WED;
printf("%d",day);//3
return 0;
}
输出结果为3
枚举类型的使用
#include <stdio.h>
#include <stdlib.h>
int main()
{
enum color { red = 1, green, blue };
int favorite_color;
/* 用户输入数字来选择颜色 */
printf("请输入你喜欢的颜色: (1. red, 2. green, 3. blue): ");
scanf("%u", &favorite_color);
/* 输出结果 */
switch (favorite_color)
{
case red:
printf("你喜欢的颜色是红色");
break;
case green:
printf("你喜欢的颜色是绿色");
break;
case blue:
printf("你喜欢的颜色是蓝色");
break;
default:
printf("你没有选择你喜欢的颜色");
}
return 0;
}
上述代码中我们也可以将case 后的blue等枚举成员换成1,2,3,4,但是这样就降低了代码的易读性。这就是枚举类型的好处。
枚举注意事项
1.枚举类型是按照整型变量来处理的。枚举类型的大小是4。
enum day {
MONDAY,
TUESDAY
};
int main()
{
enum day d;
printf("%zd\n", sizeof(d));//输出结果是4
return 0;
}
2.我们可以给枚举变量赋值,但是不能改变枚举成员的值。
上面MON = 2是错误的写法,但是enum DAY day = -1是正确的。但其实第二种写法也就在C语言中可以通过,因为C语言的语法检查没有那么严格。严谨的应该是给枚举变量赋值一个枚举类型的值。
3.我们可以给定义的变量赋值枚举成员,那么他的值就是枚举成员的值
enum day {
MONDAY,
TUESDAY
};
int main()
{
int i = TUESDAY;
printf("%d\n", i);//输出结果是1
return 0;
}
4.不能定义的变量直接赋值给枚举类型(第二条不严谨)
当我们把文件切换为C++的时候就会发现我们给枚举变量赋初值的时候全都报错了。因为不能直接将非枚举类型的值直接赋值给枚举类型。如果要赋值就要强转或者赋值枚举类型的值。 比如enum DAY d = MONDAY
。
int main()
{
enum day
{
saturday,
sunday,
};
int a = 1;
enum day weekend;
weekend = ( enum day ) a; //类型转换
//weekend = a; //错误
printf("weekend:%d",weekend);
return 0;
}