枚举
1. 需求
- 举个例子,比如:一星期有7天,请定义数据表示星期一到星期天
1.1 传统方法
-
使用#define 来完成
-
define MON 1
-
define TUE 2
-
define WED 3
-
define THE 4
-
define FRI 5
-
define SAT 6
-
define SUN 7
-
-
分析:看起来代码量较多,且不好管理
2 . 基本介绍
- 枚举是C语言的一种构造数据类型,它可以让数据更简洁,更易读,对于只有几个有限的特定数据,可以使用枚举
- 枚举对应英文(enumeration 简写 enum)
- 枚举是一组常量的集合,包含一组有限的特定的数据
- 枚举语法定义格式
enum 枚举名 {枚举元素1,枚举元素2.........}
3.快速入门
#include<stdio.h>
void main(){
enum DAY{
MON=1,TUE=2,WED=3,THU=4,FRI=5,SAT=6,SUN=7
};//这里DAY就是枚举类型包含了7个枚举元素
enum DAY day;//enum DAY是枚举类型,day是枚举变量
day = WED;//给枚举变量day赋值,值就是某个枚举元素
printf("%d",day);
getchar();
}
4 . 枚举的遍历
- C语言中,枚举类型是被当作int 或者unsigned int 类型来处理的,枚举类型必须连续是可以实现有条件的遍历。以下实例使用for来遍历枚举的元素
enum DAY{
MON=1,TUE,WED,THU,FRI,SAT,SUN//如果没有赋值,就会按照顺序赋值
}day;//表示定义了一个枚举类型enum DAY,同时定义了一个变量day(类型是enum DAY)
int main(){
//遍历枚举元素
//day++会给出警告,但是可以运行
for(day=MON;day<=SUN;day++){//要求枚举元素是连续赋值
printf("枚举元素:%d",day);
}
getchar();
return 0;
}
5 . switch中使用枚举
- C语言中,switch中可以使用枚举类型
int main(){
enum SEASONS{
SPRING=1,SUMMER,AUTUMN,WINTER
};//定义枚举类型 enum SEASONS
enum SEASONS season;//定义一个枚举类型变量season(类型enum SEASONS)
printf("请输入你喜欢的季节:(1.spring 2.summer 3.autumn 4.winter):");
scanf("%d",&season);
switch(season){
case SPRING:
printf("你喜欢的季节是春天");
break;
case SUMMER:
printf("你喜欢的季节是夏天");
break;
case AUTUMN:
printf("你喜欢的季节是秋天");
break;
case WINTER:
printf("你喜欢的季节是冬天");
break;
default:
printf("没有你喜欢的季节");
}
getchar();
getchar();
return 0;
}
6.枚举类型使用注意事项和细节
- 第一个枚举成员的默认值为整型的0,后续枚举成员的值在前一个成员上加1
- 在定义枚举类型使改变枚举元素的值
enum DAY{
MON,TUE,WED,THE=9,TRI,SAT,SUN//如果没有给赋值,就会按照顺序赋值
}day;
//表示定义了一个枚举类型enum DAY,同时定义了一个变量day
//说明 FRI SAT SUN 就是10 11 12
- 枚举变量的定义的形式:先定义枚举类型,后定义枚举变量
enum DAY{
MON=1,TUE,WED,THE,TRI,SAT,SUN
};
enum DAY day;
- 枚举变量的定义形式2:定义枚举类型的同时定义枚举变量
enum DAY{
MON=1,TUE,WED,THE,FRI,SAT,SUN
}day;
- 枚举变量的定义形式3:省略枚举名称,直接定义枚举变量
enum{
MON=1,TUE,WED,THE,FRI,SAT,SUN
}day;
//这样使用枚举,该枚举只能使用一次
- 不可以将整数转换为对应的枚举值
- 不能直接将一个整数,赋给枚举变量,但是可以将整数转成枚举类型再赋给枚举变量
int main(){
enum SEASONS{SPRING=1,SUMMER,AUTUMN,WINTER};
enum SEASONS season;
int n=4;
season = (enum SEASONS)n;
printf("season=%d",season);
getchar();
rerurn 0;
}