I. enum枚举类型
1 . 如果一个变量只有几种可能的值,则可以定义为“枚举类型”;所谓“枚举”就是把可能的值一一的列举出来,变量的值只限于列举出来的值的范围。如:
语法:
enum 枚举类型{枚举成员列表};
//其中的枚举成员列表是以逗号“,”相分隔
如:
enum Spectrum{red,balck,yellow,blue,white};
其中:enum为关键字, Spectrum为该枚举类型的标记名(标记名:遵循标识符的命名规则);
花括号“{}”中的red,black,yellow,blue,white称为“枚举元素”或“枚举常量”;
2.可以用“枚举类型”声明符号名称来表示int型常量。只要是能使用int型的地方就能够使用枚举类型。注意:C语言中的枚举的一些特性不适合C++;比如c中的枚举变量允许使用++运算符,但是c++中则不允许。
3.有关枚举类型常量的默认值
这里仍然拿上面的枚举类型常量作为示例:
enum Spectrum{red,balck,yellow,blue,white};
0 1 2 3 4
默认情况下:该枚举列表中的常量值分别为:0,1,2,3,4
当然也可以在枚举声明中,可以为枚举常量指定整数值:如
enum Spectrum{red=10,balck=20,yellow=30,
blue=40,white=50};
也可以只对枚举类型中的一个枚举元素赋值;这时该枚举元素后面的枚举元素会被赋予后续的值。如:
enum Spectrum{red,balck=22,yellow,blue,white};
则:red=0,black=22,yellow=23,blue=24,white=25;
2018-04-26 07:04:01 补充
4.枚举类型也可以是匿名的
匿名的枚举类型会有着意想不到的作用,比如在程序中需要使用数值的名字
的时候,常常有3
种方法可以实现。
(1)宏定义
#define FALSE 0
#define TRUE 1
但是宏定义
有弱点:其定义的只是预处理阶段的名字,在编译器的预处理阶段会进行简单的名字替换,而且不会进行类型的安全检查,其作用域是全局的,因此若程序中有变量true、false
,则会被替换。为了避免这样的情况,采用将全部的宏用大写
来命名,以区别于正常的代码。
(2)匿名的enum
枚举
enum {FALSE,TRUE}; //FALSE 0, TRUE 1
这里的FALSE,TRUE
都是编译时期的名字,编译器会对其进行类型检查,若代码中其他地方有和该名字冲突的,会报错。因此采用匿名的枚举不会有产生干扰正常代码的尴尬。
(3)采用静态变量
c++
中更加推荐使用该方式,如:
static const int FALSE = 0;
static const int TRUE = 1;
在这里的TRUE,FALSE
同样会得到编译器在编译阶段的检查。由于是静态变量,因此其作用域被限制到了本文件内。相比于enum
枚举类型,静态变量不仅是编译时期的名字,同时编译器还可能会在代码中为TRUE,FALSE
产生实际的数据,这会增加一点存储空间。
5.枚举类型的作用:提高程序的可读性和可维护性;
代码示例1:输出12个月的英文单词
#include<stdio.h>
#include <stdlib.h>
enum Months{jan=1,feb,mar,apr,may,jun,jul,aug,sep,oct,nov,dec};
int main(void)
{
enum Months m;
//flag用来标记输出的个数,若为4个,则输出一个换行符
int flag=0;
//指针数组,存放的是个字符串的入口地址
char *months[]={"January","February","March","April","May","June",
"July","August","September","October","November","December"};
for (m=jan;m<=dec;m++)
{
printf ("%-d月份:%-10s ",m,months[m-1]);
flag++;
if (flag%4==0)
{
putchar('\n');
}
}
system ("pause");
return 0;
}