首页 > 编程知识 正文

c枚举类型enum用法,c语言enum是什么意思

时间:2023-05-03 14:51:53 阅读:126820 作者:2090

在实际编程中,一些数据的取值往往有限,只能是非常少量的整数。 另外,为了便于在后续代码中使用,最好对各值进行命名,例如一周只有7天、一年只有12个月、一个班每周有6个课程等。

以每周7天为例,可以使用#define命令每天指定名称。

#包含

#define Mon 1

#define Tues 2

#定义wed 3

#define Thurs 4

#定义fri 5

#define Sat 6

#define Sun 7

intmain () {intday;

扫描(“% d”,日期); 交换机(天)情况通知: puts ) Monday ); 布雷克; casetues:puts(Tuesday ); 布雷克; 案例wed : puts (Wednesday ); 布雷克; casethurs:puts(Thursday ); 布雷克; casefri:puts(Friday ); 布雷克; casesat:puts(Saturday ); 布雷克; casesun:puts(Sunday ); 布雷克; 默认: puts (' error!' );

}返回0;

}

执行结果:

5

弗雷迪

#define命令可以解决问题,但会带来不小的副作用,宏名称太多,代码松散,总觉得不舒服。 c语言提供枚举(Enum )类型,允许您列出和命名所有可能的值。

枚举类型的定义格式如下:

枚举类型名称{ value name 1,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开始递增,与上面的写法等价。

枚举是一种可以定义枚举变量的类型。

枚举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;

【例】判断用户输入了星期几。

#包含

intmain () enumweek ) mon=1,Tues,Wed,Thurs,Fri,Sat,sun ) day;

扫描(“% d”,日期); 交换机(天)情况通知: puts ) Monday ); 布雷克; casetues:puts(Tuesday ); 布雷克; 案例wed : puts (Wednesday ); 布雷克; casethurs:puts(Thursday ); 布雷克; casefri:puts(Friday ); 布雷克; casesat:puts(Saturday ); 布雷克; casesun:puts(Sunday ); 布雷克; 默认: puts (' error!' );

}返回0;

}

执行结果:

4

Thursday

需要注意的两点是:

1 )枚举列表中标识符为Mon、Tues和Wed的范围是全局(严格来说是main )函数内部),不能定义与它们同名的变量。

2 ) Mon、Tues、Wed等是常量,不能给它们赋值,只能给其他变量赋值。

枚举与宏非常类似。 宏在预处理阶段用相应的值替换名称,枚举在编译阶段用相应的值替换名称。 枚举可以理解为编译阶段的宏。

在上面的代码中,在编译的某个时刻,如下所示:

#包含

intmain () enumweek ) mon=1,Tues,Wed,Thurs,Fri,Sat,sun ) day;

扫描(“% d”,日期); 交换机(天)情况1: puts ) Monday ); 布雷克; case2:puts(Tuesday ); 布雷克; case3:puts(wednesday ); 布雷克; case4:puts(Thursday ); 布雷克; case5:puts(Friday ); 布雷克; case6:puts(Saturday ); 布雷克; case7:puts(Sunday ); 布雷克; 默认: puts (' error!' );

}返回0;

}

所有名称Mon、Tues和Wed都已被相应的数字替换。 也就是说,Mon、Tues、Wed等不是变量,不消耗数据区域(常数区域、全局数据区域、堆栈区域、堆区域)的内存,直接编译成命令并配置在代码区域中,所以使用获取它们的地址这就是枚举的本质。

内存中程序的分区和每个分区的作用将在《C语言内存》特集的《Linux下C语言程序的内存布局(内存模型)》节中详细介绍。

如《C语言switch语句》节所述,case关键字后面必须有整数或结果为整数的表达式,但不能包含变量。 名称Mon、Tues和Wed最终将替换为整数,因此可以将其放在case之后。

枚举类型变量必须存储整数。 我认为需要和int一样长。 验证一下吧。

#包含

intmain () enumweek ) mon=1,Tues,Wed,Thurs,Fri,Sat,Sun } day=Mon;

printf(%d、%d、%d、%d、%d、%dn '、sizeof(enumweek )、sizeof (day )、sizeof (mon )、sizeof (wed ) )、sizeof 返回0;

}

执行结果:

4,4,4,4,4

------------- -请参阅

转发: http://c.biancheng.net/CPP/html/99.html

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。