[编制程序] C语言枚举类型(Enum),枚举enum

枚举定义的三种方式

C语言学习015:联合(union)与枚举(enum),015enum

最近在写数据结构的广义表时候用到了这个概念,在学习C语言的时候没有太注意们这里学一下。

[编程] C语言枚举类型(Enum),枚举enum

C语言枚举类型(Enum):
定义形式为:enum typeName{ valueName1, valueName2, valueName3, ……
};
enum 类型名{名字1,名字2} 枚举变量,枚举值默认从 0 开始,往后逐个加
1(递增)

枚举和宏其实非常类似:宏在预处理阶段将名字替换成对应的值,枚举在编译阶段将名字替换成对应的值。我们可以将枚举理解为编译阶段的宏。

 

例子:

#include <stdio.h>
int main(){
        enum week {Mon=1,Tues,Wed,Thurs,Fri,Sat,Sun} day;
        scanf("%d",&day);
        switch(day){
                case Mon:
                        printf("星期一\n");
                        break;
                case Tues:
                        puts("星期二");
                        break;
                case Wed:
                        puts("星期三");
                        break;
                case Thurs:
                        puts("星期四");
                        break;
                case Fri:
                        puts("星期五");
                        break;
                case Sat:
                        puts("星期六");
                        break;
                case Sun:
                        puts("星期七");
                        break;
                default :

                        puts("Error");


        }    

}

 

] C语言枚举类型(Enum),枚举enum
C语言枚举类型(Enum): 定义形式为:enum typeName{ valueName1,
valueName2, valueName3, …… }; enum 类型名{名字…

在实际编程中,有些数据的取值往往是有限的,只能是非常少量的整数,并且最好为每个值都取一个名字,以方便在后续代码中使用,比如一个星期只有七天,一年只有十二个月,一个班每周有六门课程等。

(1)

联合

  联合和结构的区别是,结构会为每个字段申请一片内存空间,而联合只是申请了一片内存空间然后所有字段都会保存到这片空间中,这片空间的大小由字段中最长的决定,下面我们就开始定义一个联合

1 //联合的定义
2 typedef union{
3     short count;
4     float weight;
5     float volume;
6 } quantity;

  联合的使用 我们可以通过很多的方式为联合赋值

 1 typedef struct{
 2     const char* color;
 3     quantity amount;
 4 }bike;
 5 
 6 int main(){
 7     //用联合表示自行车的数量
 8      bike b={"red",5};
 9      printf("bike color:%s count:%i\n",b.color,b.amount.count);
10      //用联合表示自行车的重量
11      bike b2={"red",.amount.weight=10.5};
12      printf("bike color:%s count:%f\n",b2.color,b2.amount.weight);
13     return 0;
14 }

  但是在读取联合的值的时候会很容易出问题,比如我们保存了一个float类型的字段,但通过short字段读取,得到了与预期毫不相干的值

图片 1

我在网上结合了很多资料,这里自己总结一下。

以每周七天为例,我们可以使用#define命令来给每天指定一个名字:

#include 

enum ENUM_TEST 
{
  ENUM_EST1=1,
  ENUM_EST2,
    ENUM_EST3,
    ENUM_EST4,
    ENUM_EST5,
    ENUM_EST6,
    ENUM_EST7,
    ENUM_EST8,
    ENUM_EST9,
    ENUM_EST10,
};
int main()
{
    enum ENUM_TEST enum_test;
    enum_test = ENUM_EST10 + 1;
    printf("enum_test=%d\n", enum_test); 
    return 0;
}
结果:enum_test=11

枚举

  为了避免像联合哪样把字段的数据类型搞混乱,我们可以使用枚举

 1 #include <stdio.h>
 2 
 3 //枚举的定义和结构类
 4 typedef enum colors{RED,BLACK,BLUE,GREEN} colors;
 5 
 6 int main(){
 7     colors favorite=BLUE;
 8     printf("%i",favorite);
 9     return 0;
10 }

  如果想要保存多种数据类型l联合毕枚举更适用,那么要保存多条数据的话枚举比联合更适合

联合
联合和结构的区别是,结构会为每个字段申请一片内存空间,而联合只是申请了一片内存空…

首先说,JAVA和C++中都有枚举类型。

图片 2

(2)

 

运行结果:

#include 

enum
{
    ENUM_EST1=1,
    ENUM_EST2,
    ENUM_EST3,
    ENUM_EST4,
    ENUM_EST5,
    ENUM_EST6,
    ENUM_EST7,
    ENUM_EST8,
    ENUM_EST9,
    ENUM_EST10,

}ENUM_TEST;

int main()
{
    ENUM_TEST = ENUM_EST10 + 1;
    printf("enum_test=%d\n", ENUM_TEST); 
    return 0;
}
结果:enum_test=11

如果一个变量你需要几种可能存在的值,那么就可以被定义成为枚举类型。之所以叫枚举就是说将变量或者叫对象可能存在的情况也可以说是可能的值一一例举出来。
例如:

5↙

(3)

一个铅笔盒中有一支笔,但在没有打开之前你并不知道它是什么笔,可能是铅笔也可能是钢笔,

Friday

#include 

typedef enum
{
    ENUM_EST1=1,
    ENUM_EST2,
    ENUM_EST3,
    ENUM_EST4,
    ENUM_EST5,
    ENUM_EST6,
    ENUM_EST7,
    ENUM_EST8,
    ENUM_EST9,
    ENUM_EST10,
}ENUM_TEST;

int main()
{
    ENUM_TEST enum_test;
    enum_test = ENUM_EST10 + 1;
    printf("enum_test=%d\n", enum_test); 
    return 0;
}
结果:enum_test=11

这里有两种可能,那么你就可以定义一个枚举类型来表示它!

#define命令虽然能解决问题,但也带来了不小的副作用,导致宏名过多,代码松散,看起来总有点不舒服。C语言提供了一种枚举(Enum)类型,能够列出所有可能的取值,并给它们取一个名字。

注意1:

 

枚举类型的定义形式为:

给枚举变量赋值,如果数值超过了枚举的取值范围,则结果是不确定的,如上述三个例子。

enum box{pencil,pen};

enum typeName{ valueName1, valueName2, valueName3, …… };

注意2:

 

enum是一个新的关键字,专门用来定义枚举类型,这也是它在C语言中的唯一用途;typeName是枚举类型的名字;

最后一个枚举元素可以有“,”也可以没有

 

valueName1, valueName2, valueName3,
……是每个值对应的名字的列表。注意最后的;不能少。

注意3:

这个枚举变量内含有两个元素也称枚举元素在这里是pencil和pen,分别表示铅笔和钢笔。

例如,列出一个星期有几天:

第一种用法,在声明enum_test变量时必须用enum ENUM_TEST
声明,而不能只用ENUM_TEST;在C++中两种都是可以的。

 

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

第一种用法和第三种用法,都是声明了一种类型;

如果你想定义两个具有同样特性枚举类型的变量那么你可以用如下的两种方式进行定义!

可以看到,我们仅仅给出了名字,却没有给出名字对应的值,这是因为枚举值默认从
0 开始,往后逐个加 1(递增);也就是说,week 中的 Mon、Tues …… Sun
对应的值分别为 0、1 …… 6。

第二种用法和第三种用法,虽然只相差一个typedef关键字,但意义确大不相同;第二种用法是声明了一个枚举变量,第三种用法是声明了一个枚举类型。

enum box{pencil,pen};  



enum box box2;//或者简写成box box2;



  再有一种就是在声明的时候同时定义。



enum {pencil,pen}box,box2; //在声明的同时进行定义!

我们也可以给每个名字都指定一个值:

(1) #include enum
ENUM_TEST { ENUM_EST1=1, ENUM_EST2, ENUM_EST3, ENUM_EST4,
ENUM_EST5, ENUM_EST6, ENUM_EST7, ENUM_EST8, ENUM_EST9,
ENUM_EST10,};int…

这里看起来很像结构体;

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 开始递增,跟上面的写法是等效的。

他们是不能进行普通的算术赋值的,(pencil=1;)这样的写发是错误的,

枚举是一种类型,通过它可以定义枚举变量:

但是你可以在声明的时候进行赋值操作!

enum week a, b, c;

 

也可以在定义枚举类型的同时定义变量:

  enum box{pencil=1,pen=2};

enum week{ Mon = 1, Tues, Wed, Thurs, Fri, Sat, Sun } a, b, c;

 

有了枚举变量,就可以把列表中的值赋给它:

但是这里要特别注意的一点是,如果你不进行元素赋值操作那么元素将会被系统自动从0开始自动递增的进行赋值操作,说到自动赋值,如果你只定义了第一个那么系统将对下一个元素进行前一个元素的值加1操作

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;

enum box{pencil=3,pen};//这里pen就是4系统将自动进行pen=4的定义赋值操作!

【示例】判断用户输入的是星期几。

 

图片 3

例子:

运行结果:

 

4↙

//枚举类型C语言

//杨鑫

#include 

#include 

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;



}

Thursday

 

需要注意的两点是:

 

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

 

2) Mon、Tues、Wed
等都是常量,不能对它们赋值,只能将它们的值赋给其他的变量。

C++实现:

枚举和宏其实非常类似:宏在预处理阶段将名字替换成对应的值,枚举在编译阶段将名字替换成对应的值。我们可以将枚举理解为编译阶段的宏。

 

 

#include   

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 <看到这里要最后说一个问题,就是枚举变量中的枚举元素(或者叫枚举常量)在特殊情况下是会被自动提升为算术类型的!

 

 

枚举类型 

在实际问题中,有些变量的取值被限定在一个有限的范围内。例如,一个星期内只有七天,一年只有十二个月,

一个班每周有六门课程等等。

如果把这些量 说明为整型,字符型或其它类型显然是不妥当的。为此,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; 

j = (enum body) (j + 1);   

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"); 

}

 

 

相关文章