最近在写数据结构的广义表时候用到了这个概念,在学习C语言的时候没有太注意们这里学一下。
我在网上结合了很多资料,这里自己总结一下。
首先说,JAVA和C++中都有枚举类型。
如果一个变量你需要几种可能存在的值,那么就可以被定义成为枚举类型。之所以叫枚举就是说将变量或者叫对象可能存在的情况也可以说是可能的值一一例举出来。
例如:
一个铅笔盒中有一支笔,但在没有打开之前你并不知道它是什么笔,可能是铅笔也可能是钢笔,
这里有两种可能,那么你就可以定义一个枚举类型来表示它!
1
|
enum
box{pencil,pen};
|
这个枚举变量内含有两个元素也称枚举元素在这里是pencil和pen,分别表示铅笔和钢笔。
如果你想定义两个具有同样特性枚举类型的变量那么你可以用如下的两种方式进行定义!
1
2
3
4
5
6
7
|
enum
box{pencil,pen};
enum
box box2;
//或者简写成box box2;
再有一种就是在声明的时候同时定义。
enum
{pencil,pen}box,box2;
//在声明的同时进行定义!
|
这里看起来很像结构体;
他们是不能进行普通的算术赋值的,(pencil=1;)这样的写发是错误的,
但是你可以在声明的时候进行赋值操作!
1
|
enum
box{pencil=
1
,pen=
2
};
|
但是这里要特别注意的一点是,如果你不进行元素赋值操作那么元素将会被系统自动从0开始自动递增的进行赋值操作,说到自动赋值,如果你只定义了第一个那么系统将对下一个元素进行前一个元素的值加1操作
例如:
1
|
enum
box{pencil=
3
,pen};
//这里pen就是4系统将自动进行pen=4的定义赋值操作!
|
例子:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
//枚举类型C语言
//杨鑫
#include <stdio.h>
#include <stdlib.h>
int
main()
{
enum
egg{a, b, c};
enum
egg test;
test = a;
//对枚举变量test进行赋予元素操作,如果不赋值的话,默认是最后一个元素
switch
(test)
{
case
a:
printf(
"test的值是a\n"
);
break
;
case
b:
printf(
"test的值是b\n"
);
break
;
case
c:
printf(
"test的值是c\n"
);
break
;
}
return
0
;
}
</stdlib.h></stdio.h>
|
-
C++实现:
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118#include <iostream>
using namespace std;
int
main()
{
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; cout=
""
pre=
""
return
=
""
test=
"(enum"
><pre
class
=
"brush:java;"
>看到这里要最后说一个问题,就是枚举变量中的枚举元素(或者叫枚举常量)在特殊情况下是会被自动提升为算术类型的!
</pre>
<br>
<p> </p>
<p> </p>
<pre
class
=
"brush:java;"
>枚举类型
在实际问题中,有些变量的取值被限定在一个有限的范围内。例如,一个星期内只有七天,一年只有十二个月,
一个班每周有六门课程等等。
如果把这些量 说明为整型,字符型或其它类型显然是不妥当的。为此,C语言提供了一种称为“枚举”的类型。
在“枚举”类型的定义中列举出所有可能的取值,被说明为该“枚 举”类型的变量取值不能超过定义的范围。
应该说明的是,枚举类型是一种基本数据类型,而不是一种构造类型,因为它不能再分解为任何基本类型。
枚举类型的定义和枚举变量的说明
1
. 枚举的定义枚举类型定义的一般形式为:
enum
枚举名{ 枚举值表 };
在枚举值表中应罗列出所有可用值。这些值也称为枚举元素。
该枚举名为weekday,枚举值共有
7
个,即一周中的七天。凡被说明为weekday类型变量的取值只能是七天中的某一天。
2
. 枚举变量的说明
如同结构和联合一样,枚举变量也可用不同的方式说明,即先定义后说明,同时定义说明或直接说明。
设有变量a,b,c被说明为上述的weekday,可采用下述任一种方式:
enum
weekday{ sun,mou,tue,wed,thu,fri,sat };
enum
weekday a,b,c;
或者为:
enum
weekday{ sun,mou,tue,wed,thu,fri,sat }a,b,c;
或者为:
enum
{ sun,mou,tue,wed,thu,fri,sat }a,b,c;
11.10
.
2
枚举类型变量的赋值和使用
枚举类型在使用中有以下规定:
1
. 枚举值是常量,不是变量。不能在程序中用赋值语句再对它赋值。
例如对枚举weekday的元素再作以下赋值:
sun=
5
;
mon=
2
;
sun=mon;
都是错误的。
2
. 枚举元素本身由系统定义了一个表示序号的数值,从
0
开始顺序定义为
0
,
1
,
2
…。如在weekday中,sun值为
0
,mon值为
1
,…,sat值为
6
。
main(){
enum
weekday
{ sun,mon,tue,wed,thu,fri,sat } a,b,c;
a=sun;
b=mon;
c=tue;
printf(
"%d,%d,%d"
,a,b,c);
}
说明:
只能把枚举值赋予枚举变量,不能把元素的数值直接赋予枚举变量。如:
a=sum;
b=mon;
是正确的。而:
a=
0
;
b=
1
;
是错误的。如一定要把数值赋予枚举变量,则必须用强制类型转换。
如:
a=(
enum
weekday)
2
;
其意义是将顺序号为
2
的枚举元素赋予枚举变量a,相当于:
a=tue;
还应该说明的是枚举元素不是字符常量也不是字符串常量,使用时不要加单、双引号。
main(){
enum
body
{ a,b,c,d } month[
31
],j;
int
i;
j=a;
for
(i=
1
;i<=
30
;i++){
month[i]=j;
<span><span>j = (</span><span
class
=
"keyword"
>
enum
</span><span> body) (j +
1
); </span></span>
if
(j>d) j=a;
}
for
(i=
1
;i<=
30
;i++){
switch
(month[i])
{
case
a:printf(
" %2d %c/t"
,i,
'a'
);
break
;
case
b:printf(
" %2d %c/t"
,i,
'b'
);
break
;
case
c:printf(
" %2d %c/t"
,i,
'c'
);
break
;
case
d:printf(
" %2d %c/t"
,i,
'd'
);
break
;
default
:
break
;
}
}
printf(
"/n"
);
}</pre>
<br>
<br>
<p> </p>
<p> </p>
</endl;></iostream>