c语⾔枚举类型enum⽤法参数,C语⾔枚举类型(Enum)在实际编程中,有些数据的取值往往是有限的,只能是⾮常少量的整数,并且最好为每个值都取⼀个名字,以⽅便在后续代码中使⽤,⽐如⼀个星期只有七天,⼀年只有⼗⼆个⽉,⼀个班每周有六门课程等。
以每周七天为例,我们可以使⽤#define命令来给每天指定⼀个名字:
#include
#define Mon 1
#define Tues 2
#define Wed 3
#define Thurs 4
#define Fri 5
#define Sat 6
#define Sun 7
int main(){
int day;
scanf("%d", &day);
switch(day){
case Mon: puts("Monday"); break;
case Tues: puts("Tuesday"); break;
case Wed: puts("Wednesday"); break;
case Thurs: puts("Thursday"); break;
case Fri: puts("Friday"); break;
case Sat: puts("Saturday"); break;
case Sun: puts("Sunday"); break;
default: puts("Error!");jquery是什么有什么作用
}
return 0;
}
运⾏结果:
5↙
Friday
#define命令虽然能解决问题,但也带来了不⼩的副作⽤,导致宏名过多,代码松散,看起来总有点不舒服。C语⾔提供了⼀种枚举(Enum)类型,能够列出所有可能的取值,并给它们取⼀个名字。
枚举类型的定义形式为:
enum typeName{ valueName1, valueName2, valueName3, ...... };
enum是⼀个新的关键字,专门⽤来定义枚举类型,这也是它在C语⾔中的唯⼀⽤途;typeName是枚举类型的名字;valueName1, valueName2, valueName3, ......是每个值对应的名字的列表。注意最后的;不能少。
例如,列出⼀个星期有⼏天:
enum week{ Mon, Tues, Wed, Thurs, Fri, Sat, Sun };
可以看到,我们仅仅给出了名字,却没有给出名字对应的值,这是因为枚举值默认从 0 开始,往后逐个加 1(递增);也就是说,week 中的Mon、Tues ...... Sun 对应的值分别为 0、1 ...... 6。
我们也可以给每个名字都指定⼀个值:
enum week{ Mon = 1, Tues = 2, Wed = 3, Thurs = 4, Fri = 5, Sat = 6, Sun = 7 };
更为简单的⽅法是只给第⼀个名字指定值:
enum week{ Mon = 1, Tues, Wed, Thurs, Fri, Sat, Sun };
这样枚举值就从 1 开始递增,跟上⾯的写法是等效的。
枚举是⼀种类型,通过它可以定义枚举变量:
enum week a, b, c;
也可以在定义枚举类型的同时定义变量:
enum week{ Mon = 1, Tues, Wed, Thurs, Fri, Sat, Sun } a, b, c;
有了枚举变量,就可以把列表中的值赋给它:
enum week{ Mon = 1, Tues, Wed, Thurs, Fri, Sat, Sun };
enum week a = Mon, b = Wed, c = Sat;
或者:
enum week{ Mon = 1, Tues, Wed, Thurs, Fri, Sat, Sun } a = Mon, b = Wed, c = Sat;
【⽰例】判断⽤户输⼊的是星期⼏。
#include
int main(){
enum week{ Mon = 1, Tues, Wed, Thurs, Fri, Sat, Sun } day;
scanf("%d", &day);
switch(day){
case Mon: puts("Monday"); break;
case Tues: puts("Tuesday"); break;
case Wed: puts("Wednesday"); break;
case Thurs: puts("Thursday"); break;
case Fri: puts("Friday"); break;
case Sat: puts("Saturday"); break;
case Sun: puts("Sunday"); break;
default: puts("Error!");
}
}
运⾏结果:
4↙
Thursday
需要注意的两点是:
1) 枚举列表中的 Mon、Tues、Wed 这些标识符的作⽤范围是全局的(严格来说是 main() 函数内部),不能再定义与它们名字相同的变量。
2) Mon、Tues、Wed 等都是常量,不能对它们赋值,只能将它们的值赋给其他的变量。
枚举和宏其实⾮常类似:宏在预处理阶段将名字替换成对应的值,枚举在编译阶段将名字替换成对应的值。我们可以将枚举理解为编译阶段的宏。
对于上⾯的代码,在编译的某个时刻会变成类似下⾯的样⼦:
#include
int main(){
enum week{ Mon = 1, Tues, Wed, Thurs, Fri, Sat, Sun } day;
scanf("%d", &day);
switch(day){
case 1: puts("Monday"); break;
case 2: puts("Tuesday"); break;
case 3: puts("Wednesday"); break;
case 4: puts("Thursday"); break;
case 5: puts("Friday"); break;
case 6: puts("Saturday"); break;
case 7: puts("Sunday"); break;
default: puts("Error!");
}
return 0;
}
Mon、Tues、Wed 这些名字都被替换成了对应的数字。这意味着,Mon、Tues、Wed 等都不是变量,它们不占⽤数据区(常量区、全局数据区、栈区和堆区)的内存,⽽是直接被编译到命令⾥⾯,放到代码区,所以不能⽤&取得它们的地址。这就是枚举的本质。
关于程序在内存中的分区以及各个分区的作⽤,我们将在《C语⾔内存》专题中的《Linux下C语⾔程序的内存布局(内存模型)》⼀节中详细讲解。
我们在《C语⾔switch语句》⼀节中讲过,case 关键字后⾯必须是⼀个整数,或者是结果为整数的表
达式,但不能包含任何变量,正是由于 Mon、Tues、Wed 这些名字最终会被替换成⼀个整数,所以它们才能放在 case 后⾯。
枚举类型变量需要存放的是⼀个整数,我猜测它的长度和 int 应该相同,下⾯来验证⼀下:
#include
enum week{ Mon = 1, Tues, Wed, Thurs, Fri, Sat, Sun } day = Mon;
printf("%d, %d, %d, %d, %d\n", sizeof(enum week), sizeof(day), sizeof(Mon), sizeof(Wed), sizeof(int) );
return 0;
}
运⾏结果:
4, 4, 4, 4, 4
枚举类型enum详解——C语⾔
enum enum是C语⾔中的⼀个关键字,enum叫枚举数据类型,枚举数据类型描述的是⼀组整型值的集合(这句话其实不太妥当),枚举型是预处理指令#define的替代,枚举和宏其实⾮常类似,宏在预处理阶 ...
[编程] C语⾔枚举类型(Enum)
C语⾔枚举类型(Enum):定义形式为:enum typeName{ valueName1, valueName2, valueName3, ...... };enum 类型名{名字1,名字2} 枚举 ...
【转】java枚举类型enum的使⽤
C# 中的枚举类型 enum (属于值类型)
原⽂ C# 中的枚举类型 enum (属于值类型) C# ⽀持两种特殊的值类型:枚举和结构. 声明枚举:声明时要声明所有可能的值. using System; using System.Collect ...
深⼊理解Java枚举类型(enum)
⼈⽣苦短之Python枚举类型enum
枚举类型enum是⽐较重要的⼀个数据类型,它是⼀种数据类型⽽不是数据结构,我们通常将⼀组常⽤的常数声明成枚举类型⽅便后续的使⽤.当⼀个变量有⼏种可能的取值的时候,我们将它定义为枚举类型.在Python ...
全⾯解读Java中的枚举类型enum的使⽤
这篇⽂章主要介绍了Java中的枚举类型enum的使⽤,开始之前先讲解了枚举的⽤处,然后还举了枚举在操作数据库时的实例,需要的朋友可以参考下 关于枚举 ⼤多数地⽅写的枚举都是给⼀个枚举然后例⼦就开始sw ...
Java基础之枚举类型Enum的使⽤
Java基础之枚举类型Enum的使⽤ 定义 public enum AccruedCleanEnum { SPREAD("1","发票"),OTHER(&quo ...
《挑战30天C++⼊门极限》新⼿⼊门:C/C++中枚举类型(enum)
新⼿⼊门:C/C++中枚举类型(enum) 如果⼀个变量你需要⼏种可能存在的值,那么就可以被定义成为枚举类型.之所以叫枚举就是说将变量或者叫对象可能存在的情况也可以说是可能的值⼀⼀例举出来. ...
随机推荐
Control Flow 如何处理 Error
在Package的执⾏过程中,如果在Data Flow中出现Error,那么Data Flow component能够将错误⾏输出,只需要在组件的ErrorOutput中进⾏简单地配置,参考
SpringMVC 配置log4j
html部分---表单、iframe、frameset及其他字符的⽤法(以及name、id、value的作⽤与区别);
/action的作⽤是提交到..,methed是提交⽅法,⽤po ...
Windows添加在此处打开命令CMD
打开rededit在:HKEY_CLASS_ROOT > * > shell >下⾯新建⼀个项CMD 在CMD中新建两个字符串 ⼀个是默认,值为 @shell32.dll,- 另外⼀ ...
Android笔记——Bitmap⾃动取⾊(纯搬运)
jQuery的extend详解
JQuery的extend扩展⽅法: Jquery的扩展⽅法extend是我们在写插件的过程中常⽤的⽅法,该⽅法
有⼀些重载原型,在此,我们⼀起去了解了解. ⼀.Jquery的扩展⽅ ...
下载
[转]Cloudera Manager和CDH5.8离线安装
软件⼯程(FZU2015) 学⽣博客列表(最终版)
IntelliJ Idea 使⽤笔记
1. IntelliJ Idea解决Could not autowire. No beans of 'xxxx' type found的错误提⽰. 原因可能有两个,第⼀个是IntellijIDEA本⾝ ...
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论