C语言:枚举类型
一、枚举类型的声明
枚举顾名思义就是一一列举。我们可以把可能的取值一一列举。比如我们现实生活中:
星期一到星期日是有限的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,当然在声明枚举类型的时候也可以赋初值。
#include <stdio.h>
enum Day//星期
{
Mon,
Tues,
Wed,
Thur,
Fri,
Sat,
Sun
};
int main()
{
printf("%d\n", Mon);
printf("%d\n", Tues);
printf("%d\n", Wed);
printf("%d\n", Thur);
printf("%d\n", Fri);
printf("%d\n", Sat);
printf("%d\n", Sun);
return 0;
}
上面展示的就是枚举常量默认的取值,从0开始,然后不断往后加1。
#include <stdio.h>
enum Color//颜色
{
RED = 2,
GREEN = 4,
BLUE = 8
};
int main()
{
printf("%d\n", RED);
printf("%d\n", GREEN);
printf("%d\n", BLUE);
return 0;
}
我们也可以在声明中通过直接初始化枚举常量。当然还有一种情况,我们可以和只初始化其中几个枚举常量,后面的枚举常量都会根据其前面的值加1递推。
#include <stdio.h>
enum Color//颜色
{
RED = 2,
GREEN = 4,
BLUE
};
int main()
{
printf("%d\n", RED);
printf("%d\n", GREEN);
printf("%d\n", BLUE);
return 0;
}
二、枚举类型的优点
我们使用
#define 就可以
定义常量,为什么非要使用枚举?
其实枚举又有以下几个优点:
1.增加代码的可读性和可维护性
2.和#define定义的标识符比较枚举有类型检查,更加严谨
3.便于调试,预处理阶段会删除 #define
定义的符号
4.使用方便,一次可以定义多个常量
5.枚举常量是遵循作用域规则的,枚举声明在函数内,只能在函数内使用
三、枚举类型的使用
#include <stdio.h>
enum Color//颜色
{
RED = 1,
GREEN = 2,
BLUE = 4
};
int main()
{
enum Color clr = GREEN;//使用枚举常量给枚举变量赋值
return 0;
}
枚举类型是一种自定义类型,它的定义和其他类型的变量类似,在上图的代码中clr就是创建出的一个枚举变量。如图,我们可以将枚举常量赋值给枚举变量。那我们是否可以拿整数直接给枚举变量赋值呢?这个做法在C语言中是可以的,但是在C++是不行的,因为C++的类型检查会比较严格。说了这么多,其实还是没能看出枚举的作用,在下面进行一个演示:我们之前在实现简易计算器的时候会这样来实现,那我们能不能使用枚举来对其进行优化呢?
#include<stdio.h>
void menu()
{
printf("***0.exit***\n");
printf("***1.add****\n");
printf("***2.sub****\n");
printf("***3.mul****\n");
printf("***4.div****\n");
printf("请输入...\n");
}
int add(int x, int y)
{
return x + y;
}
int sub(int x, int y)
{
return x - y;
}
int mul(int x, int y)
{
return x * y;
}
int div(int x, int y)
{
return x / y;
}
void is(int(*p)(int, int))
{
int a, b;
printf("请输入两个操作数...\n");
scanf("%d%d", &a, &b);
printf("结果是:%d\n", p(a, b));
}
int main()
{
int n;
int(*p[5])(int, int) = { 0,add,sub,mul,div };
while (1)
{
menu();
scanf("%d", &n);
if (n > 0 && n < 5)
{
switch (n)
{
case 1:
{
is(add);
break;
}
case 2:
{
is(sub);
break;
}
case 3:
{
is(mul);
break;
}
case 4:
{
is(div);
break;
}
}
}
else if (n == 0)
{
printf("退出计算器\n");
break;
}
else
printf("输入有误\n");
}
return 0;
}
进行如下的改造我们就可以在选择语句选择函数时清楚地知道调用的是什么函数,这样就增加了代码的可读性。
#include<stdio.h>
void menu()
{
printf("***0.exit***\n");
printf("***1.add****\n");
printf("***2.sub****\n");
printf("***3.mul****\n");
printf("***4.div****\n");
printf("请输入...\n");
}
enum CAS
{
EXIT,
ADD,
SUB,
MUL,
DIV
};
int add(int x, int y)
{
return x + y;
}
int sub(int x, int y)
{
return x - y;
}
int mul(int x, int y)
{
return x * y;
}
int div(int x, int y)
{
return x / y;
}
void is(int(*p)(int, int))
{
int a, b;
printf("请输入两个操作数...\n");
scanf("%d%d", &a, &b);
printf("结果是:%d\n", p(a, b));
}
int main()
{
int n;
int(*p[5])(int, int) = { 0,add,sub,mul,div };
while (1)
{
menu();
scanf("%d", &n);
if (n > 0 && n < 5)
{
switch (n)
{
case ADD:
{
is(add);
break;
}
case SUB:
{
is(sub);
break;
}
case MUL:
{
is(mul);
break;
}
case DIV:
{
is(div);
break;
}
}
}
else if (n == EXIT)
{
printf("退出计算器\n");
break;
}
else
printf("输入有误\n");
}
return 0;
}