在实际编程中,一些数据的取值往往有限,只能是非常少量的整数。 另外,为了便于在后续代码中使用,最好对各值进行命名,例如一周只有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