1.枚举类型的声明
枚举顾名思义就是⼀⼀列举。
把可能的取值⼀⼀列举。
比如在我们现实生活中:
星期星期⼀到星期日是有限的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 都是枚举类型。
{}中的内容是枚举类型的可能取值,也叫 枚举常量 。
2.枚举类型的值
#include <stdio.h>
enum Color
{
//三原色的可能取值 - 枚举常量
RED,
GREEN,
BLUE
};
int main()
{
//enum Color color = RED;
//RED = 5;//err
printf("%d\n", RED);
printf("%d\n", GREEN);
printf("%d\n", BLUE);
return 0;
}
可以看出,RED GREEN BLUE在未赋值的情况下默认从0开始,依次递增。
#include <stdio.h>
enum Color
{
//三原色的可能取值 - 枚举常量
RED,
GREEN=5,
BLUE
};
int main()
{
//enum Color color = RED;
//RED = 5;//err
printf("%d\n", RED);
printf("%d\n", GREEN);
printf("%d\n", BLUE);
return 0;
}
可以看出,将GREEN的值赋成5,前面RED并不受影响,而后面的BLUE在RED的基础上递增。这就是枚举的赋值规律。
3.枚举类型的优点
我们可以发现,这种枚举类型与我们熟知的define在功能上极其相似,基本上可以做到如下替换。
enum Color
{
RED,
GREEN=5,
BLUE
};
#define RED 0
#define GREEN 5
#define BLUE 6
那么,枚举的优势在哪里呢?
- 增加代码的可读性和可维护性
- 和#define定义的标识符比较枚举有类型检查,更加严谨。
- 便于调试,预处理阶段会删除 #define 定义的符号
- 使⽤方便,⼀次可以定义多个常量
- 枚举常量是遵循作用域规则的,枚举声明在函数内,只能在函数内使用
4.枚举类型的使用
假如我们想实现一个选择对应模式做对应计算的小程序——
#include <stdio.h>
void menu()
{
printf("**************************\n");
printf("**** 1. add 2.sub ****\n");
printf("**** 3. mul 4.div ****\n");
printf("**** 0. exit ****\n");
printf("**************************\n");
}
int main()
{
int input = 0;
printf("请选择:>");
scanf("%d", &input);
switch (input)
{
case 1:
break;
case 2:
break;
case 3:
break;
case 4:
break;
case 5:
break;
case 0:
break;
default:
break;
}
return 0;
}
但不方便之处在于,阅读switch相关代码时无法通过1 2 3……直接联系到算术方法,还需要到menu中查看,比较麻烦。以下是运用了枚举的改进版。
#include <stdio.h>
void menu()
{
printf("**************************\n");
printf("**** 1. add 2.sub ****\n");
printf("**** 3. mul 4.div ****\n");
printf("**** 0. exit ****\n");
printf("**************************\n");
}
enum Option
{
EXIT,//0
ADD,//1
SUB,//2
MUL,//3
DIV//4
};
int main()
{
int input = 0;
printf("请选择:>");
scanf("%d", &input);
switch (input)
{
case ADD:
break;
case DIV:
break;
case MUL :
break;
case SUB:
break;
case EXIT:
break;
default:
break;
}
return 0;
}
这样,我们可以直接阅读case的部分知道接下来的操作,更加方便。
5.枚举的类型检查
在C++的方式里
enum Sex
{
MALE,//0
FEMALE,//1
SECRET//2
};
int main()
{
enum Sex s = MALE;
return 0;
}
这种赋值是成立的
#include <stdio.h>
enum Sex
{
MALE,//0
FEMALE,//1
SECRET//2
};
int main()
{
enum Sex s = 0;
return 0;
}
这种赋值在C++中是不成立的。
但是,以上两种方式在C语言中都是成立的。
相比C语言,C++的类型检查比较严格。
PS:类似于enum Sex s = 0;
这个代码其实等价于
enum Sex
{
MALE,//0
FEMALE,//1
SECRET,//2
S=0
};