枚举类型的定义

  用符号而不是具体的数字来表示程序中的数字,这么表示的好处是可读性,当别人看你的程序,看到的是单词,很容易理解这些数字背后的含义,那么用什么符号来表示名字哪?需要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)--枚举的更多相关文章

  1. 听翁恺老师mooc笔记(16)--程序设计与C语言

    问题1:计算机遍布生活的各个方面,若你需要一个功能可以下载APP,我们需要的大部分功能都可以找到对应的APP,如果没有可以自己写一个软件,但是很少人需要这么做,那么我们为什么学习计算机编程语言? 学习 ...

  2. 听翁恺老师mooc笔记(15)--文件的输入与输出

    <>重定向 如果使用标准的printf输出,有一个比较简便的方法,可以将程序的结果写入一个文件.使用<和>符号,将程序运行结果重定向到文件中去,具体使用到的代码如下: ./te ...

  3. 听翁恺老师mooc笔记(14)--格式化的输入与输出

    关于C语言如何做文件和底层操作: 文件操作,从根本上说,和C语言无关.这部分的内容,是教你如何使用C语言的标准库所提供的一系列函数来操作文件,最基本的最原始的文件操作.你需要理解,我们在这部分所学习的 ...

  4. 听翁恺老师mooc笔记(13)--类型定义和联合

    typedef 虽然我们知道使用struct这个关键字定义一个结构类型,然后可以使用该结构类型定义变量.但是每次要使用的时候都需要带着struct这个关键字,那么如何摆脱这个关键字哪?C语言提供了一个 ...

  5. 听翁恺老师mooc笔记(12)--结构中的结构

    结构数组: 和C语言中的int,double一样,一旦我们做出一个结构类型,就可以定义这个结构类型的变量,也可以定义这个结构类型的数组.比如下面这个例子: struct date dates[100] ...

  6. 听翁恺老师mooc笔记(11)--结构和函数

    结构作为函数参数: 声明了一个结构就有了一种自定义的数据类型,这个数据类型和int.float.double一样,int等基本类型可以作为函数的参数,那么这种个自定义的结构类型也应该可以作为函数参数, ...

  7. 听翁恺老师mooc笔记(10)--结构

    定义结构: 在程序里,如果想要表达一个数据就需要一个变量,而每个变量又都需要一个类型,之前学过C语言中有int.double.float.char等这些基础类型,还有指针.数组等.如果你要表达的数据比 ...

  8. 听翁恺老师mooc笔记(8)--字符串2

    字符串的赋值 字符串的输入与输出 对C语言的基础类型,比如int.double等类型,scanf.printf有专门的格式转换,而对字符串,scanf.printf使用%s格式字符进行输入与输出.当使 ...

  9. 听翁恺老师mooc笔记(7)--字符串1

    C语言中字符串的定义 如果定义一个字符数组word,并使用大括号对其初始化,如下图所示: 但是这个不是C语言的字符串,只是字符数组,不是字符串,因为不能使用字符串的方式进行计算.那么C语言的字符串长什 ...

随机推荐

  1. Halcon异常(C++)不起作用

    现象 Halcon导出的C++程序,try catch不到异常.在Halcon下可以正常Catch到异常.  C++代码:try{   tuple_max(hv_Length, &hv_Max ...

  2. jquery的过滤学习

    $("p").eq(1)  匹配下标为1的p标签        $("p").hasClass("a")匹配所有p标签class中包含a的 ...

  3. $HNOI\ 2010$ 解题报告

    HNOI 2010 解题报告 0. HNOI2010 AC代码包下载地址 注: 戳上面的标题中的'地址' 下载 代码包, 戳下面每一题的文件名 可进入 题目链接. 每一题 对应代码的文件名 我在 每一 ...

  4. 【HNOI 2002 】营业额统计(splay)

    题面 Description Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger拿出了公司的账本,账本上记录了公司成立以来每天的营 ...

  5. [TJOI2015]旅游

    树链剖分+线段树 线段树维护max,min,左往右的最大差,右往左的最大差 求LCA时一定要注意方向 # include <bits/stdc++.h> # define RG regis ...

  6. [CodeVS2370] 小机房的树 (LCA, 树链剖分, LCT)

    Description 小机房有棵焕狗种的树,树上有N个节点,节点标号为0到N-1,有两只虫子名叫飘狗和大吉狗,分居在两个不同的节点上.有一天,他们想爬到一个节点上去搞基,但是作为两只虫子,他们不想花 ...

  7. 关于使用Ajax请求json数据,@RequestMapping返回中文乱码的几种解决办法

    一.问题描述: 使用ajax请求json数据的时候,无论如何返回的响应编码都是ISO-8859-1类型,因为统一都是utf-8编码,导致出现返回结果中文乱码情况. $.ajax({ type:&quo ...

  8. Lintcode223 Palindrome Linked List solution 题解

    [题目描述] Implement a function to check if a linked list is a palindrome. 设计一种方式检查一个链表是否为回文链表. [题目链接] w ...

  9. 面向对象设计模式_命令模式(Command)解读

    在.Net框架中很多对象的方法中都会有Invoke方法,这种方法的设计实际是用了设计模式的命令模式, 模式图如下 其核心思路是将Client 向Receiver发送的命令行为进行抽象(ICommand ...

  10. 1. Java Static和Final使用总结

    static:用于属性和方法 static修饰属性:无论一个类生成多少对象,所有这些对象共用唯一一个静态成员变量.一个对象对该静态变量进行修改,其他对象对该静态变量的值也随之发生变化.可以通过类名.成 ...