听翁恺老师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语言的字符串长什 ...
随机推荐
- Tomcat下使用C3P0配置JNDI数据源(在项目的META-INF目录下创建context.xml的文件)
一.C3P0下载 C3P0下载地址:http://sourceforge.net/projects/c3p0/files/?source=navbar 下载完成之后得到一个压缩包
- spring mvc和swagger整合
pom.xml 导入jar jar包 所属 备注 spring-core spring spring核心包 spring-expression spring spEl表达式 spring-beans ...
- java基础之二分法查找
package p1; import java.util.*; public class Sortdob { public static void BubbleSort(int[] arr) { ...
- 九九乘法表的实现--JAVA基础
JAVA算法实现:输出九九乘法表 Jiujiu.java: package com.qkys.www; public class Jiujiu { public static void main(St ...
- luogu【P3387】【模板】缩点
原题入口 PS:这个题数据是由Hany01大大出出来的 %%% 这个题显然是一道强联通+DAGdp的题 (题目背景有= =) 缩点的原因就是:不缩会一直在一个地方绕圈圈 而且不能进行后面的DAPdp ...
- NOIP2010题解
所有题目链接均来自洛谷 T1机器翻译 原题戳这里 自古T1是水题 因为每一个数字都小于1000,所以对于是否在队列中可以开数组查询 对于大小的限制,弄一个队列维护大小即可(水题呀...) 这题在Win ...
- Vue-路由配置和使用步骤整理
介绍 路由:控制组件之间的跳转,不会实现请求.不用页面刷新,直接跳转-切换组件>>> 安装 本地环境安装路由插件vue-router: cnpm install vue-rou ...
- .net白盒测试
很久没写博客了,刚好这段时间空闲,做点记录 前提:最近部门需要白盒测试的工具,在网上也搜索了很多资料,国内很少有类似的资料(很少公司.net代码进行白盒测试),最后在国外(FQ)网站查找到了部分资料 ...
- angular路由详解六(路由守卫)
路由守卫 CanActivate: 处理导航到某个路由的情况. CanDeactivate:处理从当前路由离开的情况. Resole:在路由激活之前获取路由数据. 1.CanActivate: 处理导 ...
- IDEA的配置
一.使用配置 转自:http://blog.csdn.net/qq_27093465/article/details/52918873 setting: 设置外观和字体: 设置编辑器快捷键: 自动 ...