听翁恺老师mooc笔记(9)--枚举
枚举类型的定义
用符号而不是具体的数字来表示程序中的数字,这么表示的好处是可读性,当别人看你的程序,看到的是单词,很容易理解这些数字背后的含义,那么用什么符号来表示名字哪?需要const int常量的整数,不可修改的整型的变量。大家看下面的程序,0,1,2使用red,yellow,green代替,那么程序中就使用red,yellow,green而不是0,1,2:

1 #include <stdio.h> 2 3 const int red = 0; 4 const int yellow = 1; 5 const int green = 2; 6 7 int main(int argc,char const *argv[]){ 8 9 int color = -1; 10 char *colorName = NULL; 11 12 printf("input your favorite color:"); 13 scanf("%d",&color); 14 switch(color){ 15 case red: colorName = "red"; break; 16 case yellow: colorName = "yellow";break; 17 case green: colorName = "green";break; 18 default: colorName = "unknown";break; 19 } 20 printf("your favorite color is:%s\n",colorName); 21 22 return 0; 23 } 24
上述程序需要使用g++进行编译,若使用gcc会出现错误,gcc和g++对const的处理不同。具体修改dev-c++的方式如下,工具-->编译选项-->程序,将gcc手动更改为g++:
更进一步,现在我们用一个更加方便的方式来定义一些可以排列起来或者罗列起来的一些名字,这就是枚举,枚举是有名字的,定义方式比如:enum COLOR {RED,YELLOW,GREEN},这个枚举类型有三个数,我们可以不知道这三个单词什么意思,但是需要知道RED是0,YELLOW是1,GREEN是2,然后上述程序就可以使用RED,YELLOW,GREEN,这是一种更方便的方式定义数字的名字,比用const int 更方便一些:

1 #include <stdio.h> 2 enum COLOR { 3 RED, YELLOW, GREEN 4 }; 5 6 int main(int argc,char const *argv[]){ 7 8 int color = -1; 9 char *colorName = NULL; 10 11 printf("input your favorite color:"); 12 scanf("%d",&color); 13 switch(color){ 14 case RED: colorName = "red"; break; 15 case YELLOW: colorName = "yellow";break; 16 case GREEN: colorName = "green";break; 17 default: colorName = "unknown";break; 18 } 19 printf("your favorite color is:%s\n",colorName); 20 21 return 0; 22 } 23
所以:枚举是一种用户定义的数据类型,它用关键字enum以如下的语法来声明,包括枚举类型名字、包括各个名字的大括号、最后还需要分号结尾:
enum 枚举类型名字 {名字0,名字1,......,名字n}; |
枚举类型名字通常并不真的使用,要用的是在大括号里的名字,因为它们就是常量符号,它们的类型是int,值则依次从0到n。所以上述例子中enum colors {red,yellow,green}创建了三个常量:red的值就是0,yellow就是1,green就是2。当我们需要一些可以排列起来的常量值时,定义枚举的意义就是给了这些常量值的名字。
枚举类型的使用一,可进行输入输出:
下述程序中enum color {red,yellow,green}这一行是在声明一种新的数据类型,这种数据类型叫做color,这个数据类型可以当作int,float来用,但是使用枚举类型的时候需要带上enum,比如f函数的参数是一个color类型的变量c,那么定义c的时候只是用color是不行的,必须带上enum。(在c语言中必须带上enum,在c++中可以)
1 #include <stdio.h> 2 3 enum color {red,yellow,green}; //声明一个新的数据类型color,类似int/float 4 5 void f(enum color c); //使用color定义一个变量c,定义时需要包括enum 6 7 int main(void){ 8 enum color t = red; //定义变量t,t的类型是enum color类型,t的值是red 9 scanf("%d",&t); 10 f(t); //将t的值传给f函数 11 12 return 0; 13 } 14 15 void f(enum color c){ 16 printf("%d\n",c); 17 }
实际上,在C语言内部中,enum就是int,所以每个枚举类型的变量是可以像int一样进行输入与输出的。
枚举类型的使用二:自动计数的枚举
在枚举的定义当中,所有的名字的量是依次递增的,比如enum COLOR{RED,YELLOW,GREEN,NumCOLORS};RED是0,YELLOW是1,GREEN是2,所以跟在最后一个名字后面的量的值就是前面名字的计数,NumCOLORS是3,刚好前面有3个名字。这是一个小套路,在枚举类型中,所有的有意义的名字的最后再放一个Num**S,用这个名字来表示枚举中共有多少个值。
定义NumCOLORS来计数枚举类型中有多少个名字,那么就可以使用NumCOLORS来定义数组,也可以使用NumCOLORS来判断用户输入的数字是不是再有效的范围内,也可以将NumCOLORS放在for循环中进行遍历所有的枚举量。

1 #include <stdio.h> 2 enum COLOR{ 3 RED,YELLOW,GREEN,NumCOLORS 4 }; 5 6 int main(int argc,char const *argv[]){ 7 int color =-1; 8 char *ColorNames[NumCOLORS] = {"red","yellow","green"}; 9 char *colorName = NULL; 10 11 printf("input your favorite color:"); 12 scanf("%d",&color); 13 if(color>=0 && color<NumCOLORS){ 14 colorName = ColorNames[color]; 15 } 16 else{ 17 colorName = "unknown"; 18 } 19 printf("your favorite color is %s\n",colorName); 20 21 return 0; 22 }
枚举类型的使用三:声明枚举量的时候可以指定值
在定义枚举类型时,可以对枚举量指定值,不需要一定从0开始,比如可以这么定义:enum COLOR{RED=1,YELLOW,GREEN=5},当RED定义为1的时候,YELLOW就是1+1=2,定义时也可以是离散的,GREEN=5,中间的没有3和4,那么如下程序就可以输出5,但是NumCOLORS则就是6了,不可以作为计数了:

1 #include <stdio.h> 2 enum COLOR { 3 RED=1, 4 YELLOW, 5 GREEN=5, 6 NumCOLORS 7 }; 8 int main(int argc,char const *argv[]){ 9 printf("code for green is %d\n",GREEN); 10 printf("code for numcolors is %d\n",NumCOLORS); 11 return 0; 12 }
枚举类型的使用四:枚举只是int
在下面程序中,COLOR中各个量的值是1、2、5、6,并没有0。但在main中,给枚举类型的变量color赋值了一个不存在的整数值,编译器居然没有任何warning或error,这是因为枚举类型虽然可以当作类型使用,但是实际上很少这么用。现在在C语言中,使用枚举类型的需求,是用在有意义上排比的名字,用来定义符号量,用枚举比const int方便,因为不需要一行行定义const int,只需要使用enum定义一行就可以了。另外枚举比宏(macro)号,因为枚举有类型而宏没有。
posted on 2017-03-21 11:04 niuxiaoxia 阅读(392) 评论(0) 编辑 收藏 举报
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步