听翁恺老师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语言的字符串长什 ...
随机推荐
- C# 获取一个独一无二的字符串 GUID
在保存文件,创建目录时,为了保证名称不重复,经常使用Random产生一个随机数,有更简单且不会重复的办法是: Guid.NewGuid().ToString() 就会生成一个类似 37c1acec-4 ...
- babel-runtime和babel-polyfill两者区别优缺点
先说两种方式的原理: babel-polyfill 使用场景 Babel 默认只转换新的 JavaScript 语法,而不转换新的 API.例如,Iterator.Generator.Set.Maps ...
- HttpServletRequest对象
一.HttpServletRequest介绍 HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,通过这个对象 ...
- Centos samba 服务配置
1背景 转到Linux有段时间了,vim操作还不能应对工程代码,之前一直都是Gnome桌面 + Clion 作开发环境,无奈在服务器上没有这样的环境, 看同事是(Windows)Source Insi ...
- 2017angular、vue、react热度
中国,过去一年: 中国,过去五年: 全球,过去一年: 全球,过去五年: 其他相关: 数据来源自:Google Trends
- 系统及DB参数引发的“灾难”
最近,处理了一个系统及db参数设置不合理引发"灾难"的案例.前几天,接到某用户的紧急求助电话,同时,也收到了邮件.大概内容是:该用户某系统接连出现挂死现象,问题直指后台数据库(ai ...
- Django 2.0 学习(03):Django视图和URL(下)
接上篇博文,继续分析Django基本流程. 编写第一个(view)视图函数 1.打开文件polls/views.py,输入下面的Python代码: from django.http import Ht ...
- 设计模式——简单工厂模式(C++实现)
#include <iostream> #include <string> using namespace std; class COperator { public: ; p ...
- 数据操纵:SELECT, INSERT, UPDATE, DELETE
SELECT 句法 SELECT [STRAIGHT_JOIN] [SQL_SMALL_RESULT] [SQL_BIG_RESULT] [SQL_BUFFER_RESULT] [SQL_CACHE ...
- MySQL的bigint类型
bigint支持的数字的大小范围为:19位,存电话号码.有符号范围:-9223372036854775808 到 9223372036854775807 int支持的数字范围为:10位,有符号范围:- ...