11.10 枚举类型
在实际问题中,有些变量的取值被限定在一个有限的范围内。例如,一个星期内只有七天,一年只有
十二个月,一个班每周有六门课程等等。如果把这些量说明为整型,字符型或其它类型显然是不妥当的。
为此,C语言提供了一种称为“枚举”的类型。在“枚举”类型的定义中列举出所有可能的取值,被说明为
该“枚举”类型的变量取值不能超过定义的范围。应该说明的是,枚举类型是一种基本数据类型,而不是
一种构造类型,因为它不能再分解为任何基本类型。
11.10.1 枚举类型的定义和枚举变量的说明
1. 枚举的定义枚举类型定义的一般形式为:
enum 枚举名{ 枚举值表 };
在枚举值表中应罗列出所有可用值。这些值也称为枚举元素。
例如:
该枚举名为weekday,枚举值共有7个,即一周中的七天。凡被说明为weekday类型变量的取值只能是七天中的某一天。
如果一个变量你需要几种可能存在的值,那么就可以被定义成为枚举类型。之所以叫枚举就是说将变量或
者叫对象可能存在的情况也可以说是可能的值一一例举出来。
举个例子来说明一吧,为了让大家更明白一点,比如一个铅笔盒中有一支笔,但在没有打开之前你并不知
道它是什么笔,可能是铅笔也可能是钢笔,这里有两种可能,那么你就可以定义一个枚举类型来表示它!
enum box{pencil,pen};//这里你就定义了一个枚举类型的变量叫box,这个枚举变量内含有两个元
素也称枚举元素在这里是pencil和pen,分别表示铅笔和钢笔。
这里要说一下,如果你想定义两个具有同样特性枚举类型的变量那么你可以用如下的两种方式进行定义!
enum box{pencil,pen};
enum box box2;//或者简写成box box2;
再有一种就是在声明的时候同时定义。
enum {pencil,pen}box,box2; //在声明的同时进行定义!
枚举变量中的枚举元素系统是按照常量来处理的,故叫枚举常量,他们是不能进行普通的算术赋值的,
(pencil=1;)这样的写发是错误的,但是你可以在声明的时候进行赋值操作!
enum box{pencil=1,pen=2};
但是这里要特别注意的一点是,如果你不进行元素赋值操作那么元素将会被系统自动从0开始自动递增
的进行赋值操作,说到自动赋值,如果你只定义了第一个那么系统将对下一个元素进行前一个元素的值加1
操作,例如
enum box{pencil=3,pen};//这里pen就是4系统将自动进行pen=4的定义赋值操作!
前面说了那么多,下面给出一个完整的例子大家可以通过以下的代码的学习进行更完整的学习!
#include <iostream>
using namespace std;
void main(void)
{
enum egg {a,b,c};
enum egg test; //在这里你可以简写成egg test;
test = c; //对枚举变量test进行赋予元素操作,这里之所以叫赋元素操作不叫赋值
//操作就是为了让大家明白枚举变量是不能直接赋予算数值的,例如(test=1;)
//这样的操作都是不被编译器所接受的,正确的方式是先进行强制类型转换
//例如(test = (enum egg) 0;)!
if (test==c)
{
cout <<"枚举变量判断:test枚举对应的枚举元素是c" << endl;
}
if (test==2)
{
cout <<"枚举变量判断:test枚举元素的值是2" << endl;
}
cout << a << "|" << b << "|" << test <<endl;
test = (enum egg) 0; //强制类型转换
cout << "枚举变量test值改变为:" << test <<endl;
cin.get();
}
看到这里要最后说一个问题,就是枚举变量中的枚举元素(或者叫枚举常量)在特殊情
况下是会被自动提升为算术类型的!
#include <iostream>
using namespace std;
void main(void)
{
enum test {a,b};
int c=1+b; //自动提升为算术类型
cout << c <<endl;
cin.get();
}
我自己弄的例子:
1 /*================================================ ================
2 *Name: /arm/2440_root/app/gnu_test/test01.c
3 *Made by: zhangshengheng @ Wed Sep 16 10:12:44 CST 2009
4 *Email: zhangshengheng@126.com
5 *FUNC: the function of this program is :
6 enum用法的检验
7 ================================================== ==============*/
8 #include <stdio.h>
9 #include <stdlib.h>
10 #include <string.h>
11
12 typedef enum egg {
13 NO_ECC_0,
14 ECC6_1,
15 ECC11_2 = 100,
16 ECC_RE_3
17 }ECC_TYPE;
18
19 int main(void)
20 {
21 ECC_TYPE ecc;
22 printf("************test enum*****************\n");
23 printf("the ECC_TYPE = %d\n", ecc=NO_ECC_0);
24 printf("the ECC_TYPE = %d\n", ecc=ECC6_1);
25 printf("the ECC_TYPE = %d\n", ecc=ECC11_2);
26 printf("the ECC_TYPE = %d\n", ecc=ECC_RE_3);
27
28
29
30 return 0;
31
32 }
程序运行结果:
dtlinux@gnu_test$./enum
************test enum**********
the ECC_TYPE = 0
the ECC_TYPE = 1
the ECC_TYPE = 100
the ECC_TYPE = 101