常量符号化
用符号而不是具体的数字来表示程序中的数字
- 可读性加强
用更加方便的方式定义这些罗列起来的名字 —— 枚举
枚举
枚举是一种用户定义的数据类型,他用关键字 enum 以如下方法声明
enum 枚举类型名字 { 名字0,...,名字n } ;
枚举类型名字通常并不真的使用,要用的是在大括号里的名字,因为它们就是常量符号,他们的类型是 int ,值依次从 0 到 n ,如:
enum colors { red , yellow , green } ;
创建了 3 个常量,red 的值是 0 ,yellow 的值是 1 ,green 的值是 2
- 当需要一些可以排列起来的常量值时,定义枚举的意义就是给了这些常量值名字
#include<stdio.h>
enum color { red ,yellow ,green}; //声明一种新的数据类型,叫 color
void f (enum color c);
int main(void)
{
enum color t = red ;
scanf("%d",&t);
f(t);
return 0;
}
void f(enum color c)
{
printf("%d\n",c);
}
- 枚举量可以作为值
- 枚举类型可以跟上 enum 作为类型
- 实际上是以整数来做内部计算和外部输入输出的
在上述代码中,体现的是 enum color 作为变量类型来定义变量,与 int 等具有相同的效果
套路 —— 自动计数的枚举
#include<stdio.h>
enum color {red, yellow, green, numColors}; //定义enum color
int main(int argc,char const *argv[])
{
int color = -1; //给color一个小于0的初始值
char *colorNames[numColors]={ //创建colorNames数组
"red","yellow","green",
};
char *colorName = NULL; //要赋初始值
printf("输入你喜欢的颜色的代码:");
scanf("%d",&color);
if(color>=0&&color<numColors){
colorName = colorNames[color];
}else{
colorName="unknown";
}
printf("你喜欢的颜色是%s\n",colorName);
return 0;
}
可以看到 enum color 中 numColors 的值可以恰好表示前面有的元素个数,利用这一点,
- 可以创建相应长度数组
- 也可以作为条件判断输入的值是否在有效范围之内
这样需要遍历所有的枚举量或者需要建立一个用枚举量做下标的数组时就很方便
枚举量
声明枚举量的时候可以指定值
enum color { red = 1 , yellow , green = 5 } ;
这表示 red = 1 ,yellow = 2 ,green = 5
使用
枚举只是 int
enum color { red = 1 , yellow , green = 5 } ;
对于这个代码,即使给枚举类型的变量福不存在的整数值(如0)也不会有 warning
- 虽然枚举类型可以当作类型使用,但实际上很少用
主要的需求
1.要定义一些排比的符号量,用枚举比用 const int 方便
2.枚举比宏 ( macro )好,因为枚举有类型