听翁恺老师mooc笔记(9)--枚举
枚举类型的定义
用符号而不是具体的数字来表示程序中的数字,这么表示的好处是可读性,当别人看你的程序,看到的是单词,很容易理解这些数字背后的含义,那么用什么符号来表示名字哪?需要const int常量的整数,不可修改的整型的变量。大家看下面的程序,0,1,2使用red,yellow,green代替,那么程序中就使用red,yellow,green而不是0,1,2:
#include <stdio.h> const int red = ;
const int yellow = ;
const int green = ; int main(int argc,char const *argv[]){ int color = -;
char *colorName = NULL; printf("input your favorite color:");
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("your favorite color is:%s\n",colorName); return ;
}
上述程序需要使用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 更方便一些:
#include <stdio.h>
enum COLOR {
RED, YELLOW, GREEN
}; int main(int argc,char const *argv[]){ int color = -;
char *colorName = NULL; printf("input your favorite color:");
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("your favorite color is:%s\n",colorName); return ;
}
所以:枚举是一种用户定义的数据类型,它用关键字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++中可以)
#include <stdio.h> enum color {red,yellow,green}; //声明一个新的数据类型color,类似int/float void f(enum color c); //使用color定义一个变量c,定义时需要包括enum int main(void){
enum color t = red; //定义变量t,t的类型是enum color类型,t的值是red
scanf("%d",&t);
f(t); //将t的值传给f函数 return ;
} void f(enum color c){
printf("%d\n",c);
}
实际上,在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循环中进行遍历所有的枚举量。
#include <stdio.h>
enum COLOR{
RED,YELLOW,GREEN,NumCOLORS
}; int main(int argc,char const *argv[]){
int color =-;
char *ColorNames[NumCOLORS] = {"red","yellow","green"};
char *colorName = NULL; printf("input your favorite color:");
scanf("%d",&color);
if(color>= && color<NumCOLORS){
colorName = ColorNames[color];
}
else{
colorName = "unknown";
}
printf("your favorite color is %s\n",colorName); return ;
}
枚举类型的使用三:声明枚举量的时候可以指定值
在定义枚举类型时,可以对枚举量指定值,不需要一定从0开始,比如可以这么定义:enum COLOR{RED=1,YELLOW,GREEN=5},当RED定义为1的时候,YELLOW就是1+1=2,定义时也可以是离散的,GREEN=5,中间的没有3和4,那么如下程序就可以输出5,但是NumCOLORS则就是6了,不可以作为计数了:
#include <stdio.h>
enum COLOR {
RED=,
YELLOW,
GREEN=,
NumCOLORS
};
int main(int argc,char const *argv[]){
printf("code for green is %d\n",GREEN);
printf("code for numcolors is %d\n",NumCOLORS);
return ;
}
枚举类型的使用四:枚举只是int
在下面程序中,COLOR中各个量的值是1、2、5、6,并没有0。但在main中,给枚举类型的变量color赋值了一个不存在的整数值,编译器居然没有任何warning或error,这是因为枚举类型虽然可以当作类型使用,但是实际上很少这么用。现在在C语言中,使用枚举类型的需求,是用在有意义上排比的名字,用来定义符号量,用枚举比const int方便,因为不需要一行行定义const int,只需要使用enum定义一行就可以了。另外枚举比宏(macro)号,因为枚举有类型而宏没有。
听翁恺老师mooc笔记(9)--枚举的更多相关文章
- 听翁恺老师mooc笔记(16)--程序设计与C语言
问题1:计算机遍布生活的各个方面,若你需要一个功能可以下载APP,我们需要的大部分功能都可以找到对应的APP,如果没有可以自己写一个软件,但是很少人需要这么做,那么我们为什么学习计算机编程语言? 学习 ...
- 听翁恺老师mooc笔记(15)--文件的输入与输出
<>重定向 如果使用标准的printf输出,有一个比较简便的方法,可以将程序的结果写入一个文件.使用<和>符号,将程序运行结果重定向到文件中去,具体使用到的代码如下: ./te ...
- 听翁恺老师mooc笔记(14)--格式化的输入与输出
关于C语言如何做文件和底层操作: 文件操作,从根本上说,和C语言无关.这部分的内容,是教你如何使用C语言的标准库所提供的一系列函数来操作文件,最基本的最原始的文件操作.你需要理解,我们在这部分所学习的 ...
- 听翁恺老师mooc笔记(13)--类型定义和联合
typedef 虽然我们知道使用struct这个关键字定义一个结构类型,然后可以使用该结构类型定义变量.但是每次要使用的时候都需要带着struct这个关键字,那么如何摆脱这个关键字哪?C语言提供了一个 ...
- 听翁恺老师mooc笔记(12)--结构中的结构
结构数组: 和C语言中的int,double一样,一旦我们做出一个结构类型,就可以定义这个结构类型的变量,也可以定义这个结构类型的数组.比如下面这个例子: struct date dates[100] ...
- 听翁恺老师mooc笔记(11)--结构和函数
结构作为函数参数: 声明了一个结构就有了一种自定义的数据类型,这个数据类型和int.float.double一样,int等基本类型可以作为函数的参数,那么这种个自定义的结构类型也应该可以作为函数参数, ...
- 听翁恺老师mooc笔记(10)--结构
定义结构: 在程序里,如果想要表达一个数据就需要一个变量,而每个变量又都需要一个类型,之前学过C语言中有int.double.float.char等这些基础类型,还有指针.数组等.如果你要表达的数据比 ...
- 听翁恺老师mooc笔记(8)--字符串2
字符串的赋值 字符串的输入与输出 对C语言的基础类型,比如int.double等类型,scanf.printf有专门的格式转换,而对字符串,scanf.printf使用%s格式字符进行输入与输出.当使 ...
- 听翁恺老师mooc笔记(7)--字符串1
C语言中字符串的定义 如果定义一个字符数组word,并使用大括号对其初始化,如下图所示: 但是这个不是C语言的字符串,只是字符数组,不是字符串,因为不能使用字符串的方式进行计算.那么C语言的字符串长什 ...
随机推荐
- java实现在线支付
国内电子商务系统实现的基本流程如下: 客户在系统内下订单 -> 系统根据订单生成支付宝接口url -> 客户通过url使用支付宝(网上银行)付款 -> 支付宝将客户的付款完成信息发送 ...
- java实现组合问题
刚才刚更新了排列问题,顺带把组合问题也发表一下 1.问题描述: 已知有m个球,从m个球中取n个球有多少种不同的取法. 2.输入示例: 请输入总球的个数和要取的球的个数 6 5 3.输出示例: 共有6种 ...
- 吐血整理:人工智能PDF中文教材资源包2.73G基本包含全部学习资料-人工智能学习书单
吐血整理:人工智能PDF中文教材资源包2.73G基本包含全部学习资料 人工智能学习书单(关注微信公众号:aibbtcom获取更多资源) 文末附百度网盘下载地址 人工神经网络与盲信号处理 人工神经网络与 ...
- 前端(HTML/CSS/JS)-HTML编码规范
一.HTML编码规范 1. img标签要写alt属性 根据W3C标准,img标签要写alt属性,如果没有就写一个空的.但是一般要写一个有内容的,根据图片想要表达的意思,因为alt是在图片无法加载时显示 ...
- 【Luogu3804】【模板】后缀自动机(后缀自动机)
[Luogu3804][模板]后缀自动机(后缀自动机) 题面 洛谷 题解 一个串的出现次数等于\(right/endpos\)集合的大小 而这个集合的大小等于所有\(parent\)树上儿子的大小 这 ...
- 【CJOJ P1096】最佳老农
http://oj.changjun.com.cn/problem/detail/pid/1096 Description FJ打算带着他可爱的N (1 ≤ N ≤ 2,000)头奶牛去参加" ...
- c#多线程同步之lock
一提起lock,想必大家都很熟悉,因为它易用,顾名思义,就是一把锁,常用于多线程的同步,一次只允许一个线程进入.最近遇到一个很诡异的bug. private static readonly objec ...
- Android 视频展示控件之 SurfaceView、GLSurfaceView、SurfaceTexture、TextureView 对比总结
一.SurfaceView SurfaceView继承自View,并提供了一个独立的绘图层,你可以完全控制这个绘图层,比如说设定它的大小,所以SurfaceView可以嵌入到View结构树中,需要注意 ...
- NancyFX 第十二章 通道截拦
所有的好的Web框架都有一套好的通道截拦的机制,Nancy在我看来是处理最好的.那什么是请求通道那?下面的图可能说的比较清楚些: 正如名称中描述的,一个典型的Web请求在到达最终响应前会穿过一定数量的 ...
- ISAPI和CGI限制中没有ASP.NET v4.0
[服务器搭建]ISAPI和CGI限制中没有ASP.NET v4.0解决方式: 1.确保安装IIS时确实安装了ASP.NET,如果没有的话,勾上重新装一下,一般出现404.2时这么干 2.如果你是先装了 ...