第14天:枚举数据类型的小套路

146 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第14天,点击查看活动详情

1. 套路:自动计数的枚举

  • 在枚举的时候,所有的量都是依次递增的
    • 所以最后一个是计数,记录了前面有几个数。
    • 用最后一个名字来表示这个枚举量中有多少个值。这也是枚举中的套路
    • 这样需要遍历所有的枚举量或者需要建立一个用枚举量做下标的数组的时候就很方便了。
    • 用最后一个名字划定范围,比如说输入一个数字,看这个数值是否在程序的有效范围内
    • 最后一个名字可以作为for遍历的限定条件
#include <stdio.h>

enum COLOR {RED, YELLOW, GREEN, NumCOLORS};

int main(int argc, char const *argv[]) {
	int color = -1;
	char *ColorNames[NumCOLORS] = {
		"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;
}

总结:这个代码用枚举的值代表颜色,当用户输入颜色数字时,程序会判断这个颜色是在012这个范围内,如果在的话,输出颜色数字代表的颜色,否则输出不知道。

2. 枚举量

  • 声明枚举量的时候可以指定值
    • 这是个离散的序列
    • red是1,yellow是1+1=2,green是5
    • 中间的三和四就跳过了
    • enum COLOR {RED=1,YELLOW,GREEN=5};
#include <stdio.h>
 
enum COLOR {RED = 1, YELLOW, GREEN = 5, NumCOLORS};
int main(int argc, char const *argv[]) {
	printf("code for GREEN is %d\n", GREEN);
	return 0;
}

3. 枚举实际上只是int

  • 即使给枚举类型的变量赋不存在的整数值也没有用任何warning或error
#include <stdio.h>
 
enum COLOR {RED = 1, YELLOW, GREEN = 5, NumCOLORS};
int main(int argc, char const *argv[]) {
	printf("code for GREEN is %d\n", GREEN);
        printf("and code is %d\n", color);
	return 0;
}

总结:0是没有意义的值,但是在这里也不会报错。

4. 枚举

  • 虽然枚举类型可以当作类型使用,但是实际上很(bu)少(hao)用
  • 如果有意义上排比的名字,用枚举比const int方便
  • 枚举比宏(macro)好,因为枚举有int类型
  • 枚举是c语言里面不成功的功能
  • 人们主要是把它当作一种符号量,很少使用枚举这个功能