首页 > 编程知识 正文

枚举类型enum定义,c语言enum是什么意思

时间:2023-05-05 22:48:50 阅读:126898 作者:1600

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

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

#包含

#define Mon 1

#define Tues 2

#定义wed 3

#define Thurs 4

#定义fri 5

#define Sat 6

#define Sun 7

int main () )。

int day;

扫描(“% d”,日期);

交换机(天) {

casemon: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;

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

#包含

int main () )。

enum week{ Mon=1,Tues,Wed,Thurs,Fri,Sat,Sun } day;

扫描(“% d”,日期);

交换机(天) {

casemon:puts(Monday ); 布雷克;

casetues:puts(Tuesday ); 布雷克;

案例wed : puts (Wednesday ); 布雷克;

casethurs:puts(Thursday ); 布雷克;

casefri:puts(Friday ); B

reak;

case Sat: puts("Saturday"); break;

case Sun: puts("Sunday"); break;

default: puts("Error!");

}

return 0;

}

运行结果:

4↙

Thursday

需要注意的两点是:

1) 枚举列表中的 Mon、Tues、Wed 这些标识符的作用范围是全局的,不能再定义与它们名字相同的变量。

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

int main(){

enum week{ Mon = 1, Tues, Wed, Thurs, Fri, Sat, Sun } day = Mon;

printf("%d, %d, %d, %d, %dn", sizeof(enum week), sizeof(day), sizeof(Mon), sizeof(Wed), sizeof(int) );

return 0;

}

运行结果:

4, 4, 4, 4, 4

以上就是对 C语言枚举类型的资料整理,后续继续补充相关资料,谢谢大家对本站的支持!

本文标题: C语言 枚举类型(Enum)详解及示例代码

本文地址: http://www.cppcns.com/ruanjian/c/161383.html

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