目录
11.1.1 枚举
常量符号化
在程序中我们经常避免直接出现数字,用具体的单词或者别的能表达意思的字符串代替,这样可以大幅提升可读性。
比如用单词代替数字
#include <stdio.h>
const int red = 0;
const int yellow = 1;
const int green = 2;
int main(int argc, char const *argv[])
{
int color = -1;
char *colorName = NULL;
printf("输入你喜欢的颜色的代码: ");
scanf ("%d", &color);
switch ( color ) {
case red: colorName = "red"; break;
case yellow: colorName = "yellow"; break;
case green: coLorName = "green"; break;
default: colorName= "unknown"; break;
}
printf("你喜欢的颜色是%s\n", colorName);
return 0;
}
现在我们有一种更加方便的方式来存放罗列起来的数据,即枚举
枚举
#include <stdio.h>
//定义一个名为color的枚举
enum COLOR {RED,YELLOW,GREEN};
int main(int argc, char const *argv[])
{
int color = -1;
char *colorName = NULL;
printf("输入你喜欢的颜色的代码: ");
scanf ("%d", &color);
switch ( color ) {
case RED: colorName = "red"; break;
case YELLOW: colorName = "yellow"; break;
case GREEN: coLorName = "green"; break;
default: colorName= "unknown"; break;
}
printf("你喜欢的颜色是%s\n", colorName);
return 0;
}
这种方式要比const int定义更加方便
- 枚举是一种用户定义的数据类型,它用关键字enum来声明,定义枚举是给一些常量赋名:
- enum 枚举名 {名字0,名字1,...,名字n};
- 使用时大多会将枚举名省去,因为它并不真的使用,括号内的名字才更加重要。
- 括号内实际上是常量符号,类型是int,值依次从0到n递增
以一个程序来说明其特性:
#include <stdio. h>
enum color { red, yellow, green};
//枚举类型要跟上enum,无论是函数的参数表里还是变量里(C语言中规定)
void f(enum color c);
int main(void)
{
//枚举量可以作为值
enum color t = red;
//实际上,red就是0,C语言内部以整数来处理它
scanf("%d", &t);
f(t);
return 0;
}
void f(enum color c)
{
printf("%d\n",c);
}
小套路:自动计数的枚举
枚举内部计数规则和数组一样,从0开始计数,因此如果在元素最后加一个名字,这个名字代表的数字就是前面名字的计数量。比如
- enum color { red, yellow, green,NumColors};NumColors代表3,前面正好3个元素
此时如果需要遍历所有枚举量、或者需要建立用枚举量做下标的数组时,就可以轻松得知枚举量的个数。
#include <stdio.h>
enum COLOR {RED,YELLOW, GREEN, NumCOLORS};
int main(int argc, char const *argv[])
{
int color = -1;
//可以用NumColors建立数组
char *ColorNames [NumCOLORS] = {
"red", "yellow", "green",
};
char *colorName = NULL;
printf("输入你喜欢的颜色的代码: ");
scanf("%d", &color);
//可以用NumColors作为判断依据
if ( color >=0 && color < NumCOLORS ) {
colorName = ColorNames [color] ;
} else {
colorName= "unknown" ;
}
printf ("你喜欢的颜色是%s\n",colorName);
return 0;
}
枚举量
- 在声明枚举量的时候可以不按默认原则,自定义值
enum COLOR {RED=1,YELLOW, GREEN=5 };
//此时yellow=2
- 枚举量只是int类型(但是给枚举量赋超过int的整数也不会报错,或者0)
- 虽然枚举类型可以当成类型使用,但不好用。。。
- 意义上有排比的名字,用枚举比const int方便,不用一行一行写
- 枚举比宏(macro)好,因为枚举有int类型,宏没有类型
- 枚举的主要用途就是拿来定义一些符号量,而不是当一种类型