C语言之枚举

一 :枚举是用来干嘛的

(1)枚举在C语言中其实是一个符号常量集,直白说:枚举定义了一些符号,这些符号本身就是int类型的常量,每个符号和一个常量绑定。这个符号就表示一个自定义的标识码,编译器对枚举的认知就是符号常量所绑定的那个int类型的数字

#include <stdio.h>


//这个枚举用来表示函数返回值,ERROE表示错,RIGHT表示对
enum return_value
{

    ERROR,
    RIGHT,

};

enum return_value func(void);

int main(void)
{

    enum return_value r;
    r = func();
    if(r==RIGHT)        //不是r.RIGHT,也不是return_vale.RIGHT
        {

            printf("yes\n");

        }

    else
        {

            printf("no\n");
        }




    return 0;


}

enum return_value func(void)
{

    enum return_value r1;
    r1 = ERROR;

    return r1;

}

(2)枚举中的枚举值都是常量,怎么验证? 

#include <stdio.h>


//这个枚举用来表示函数返回值,ERROE表示错,RIGHT表示对
enum return_value
{
    //可以让符号与int类型的常量数字绑定,譬如说ERROR = 0;或ERROR=1 都是可以的
    //如果绑定了,那么这个符号就一直与int类型的常量数字绑定了,通过输出函数以整型形式打印符号
    //出来的值就是int类型的数值常量
    //如果没有绑定常量,编译器会自动将第一个元素绑定0,第二个就是1依次递增
    ERROR,     
    RIGHT,     
    TYPE,    

};

enum return_value1
{

    ERROR1 = 23, //若将ERROR赋值为23,则后面的符号自动变为常量数字24,这个符号的如果没有
                //主动绑定那么就是跟着前一个符号所绑定的int类型常量数字自动加1的
    RIGHT1,
    TYPE1,

};


int main(void)
{
        //证明枚举内的符号绑定的是int类型的常量数字,第一个符号默认对应0,第n个元素默认对应n-1
        //默认的意思是程序员在编写代码时没有,主动让符号和常量数字绑定
        printf("ERROR = %d\n",ERROR);    //打印结果:0
        printf("RIGHT = %d\n",RIGHT);    //打印结果:1
        printf("TYPE = %d\n",TYPE);      //打印结果:2
        
        printf("ERROR1 = %d\n",ERROR1);    //打印结果:23
        printf("RIGHT1 = %d\n",RIGHT1);    //打印结果:24
        printf("TYPE1 = %d\n",TYPE1);      //打印结果:25


    return 0;


}

 (3)枚举符号常量和其对应的常量数字相对来说,数字不重要,符号才重要。符号对应的数字只要彼此不相同即可,没有别的要求。所以一般情况下都不明确指定这个符号所对应的数字,而让编译器自动分配(编译器自动分配的原则是:从零开始依次增加,如果用户自定义了一个值,则从那个值开始往后依次增加)

注:虽然常量数字和符号常量对比来说数字不重要,但是这只是相对来说的。如果常量数字出现问题,也会有很大的麻烦 比如说:符号对应的数字相同

//通过使枚举符号常量对应的常量数字设置彼此相同时,将枚举变量无论是等于ERROR还是RIGHT
//当进入选择语句判断r是等于ERROR输出yes,不等于输出no时,结果都是判断r是==RIGHT,都会输出yes
//原因是因为编译器在判断 r==RIGHT r!=RIGHT 时,其实判断的是r是不是等于符号常量对应的那个int
//类型的常量数字.譬如判断r是不是等于12,在以下程序中将两个符号常量都与常量数字12绑定,所以当
//判断r是不是等于ERROR时,判断的是r是不是等于12,那不管将r通过func函数等于ERROR还是RIGHT时
//在编译器那判断的两个都是常量数字12,所以当进行选择语句判断时,直接进入if输出yes,略过else
//不输出no
#include <stdio.h>

enum return_value
{
    //当把枚举符号常量所对应的常量数字设置彼此相同时,再来看程序输出的结果
    ERROR = 12,        
    RIGHT = 12,


};


int main(void)
{

    enum return_value r;
    r = func();

    if(r == RIGHT)
        {

            printf("yes\n");
    
        }

    else
        {


            printf("no\n");

        }
        
        //可以通过打印信息来查看符号常量对应的数值
            printf("ERROR  = %d\n",ERROR );        //打印结果为12
            printf("RIGHT = %d\n",RIGHT );         //打印结果为12
            

    return 0;

}


enum return_value func(void)
{

    enum return_value r1;
    r1 = RIGHT;        //r1 = RIGHT  程序最后输出结果 yes
                       //r1 = ERROR  程序最后输出结果也是yes
    return r1;

}

二 :C语言为何需要枚举

(1)C语言没有枚举其实是可以的。使用枚举其实就是进行1、0这些数字进行符号化编码,这样的好处就是编程时可以不用看数字而直接看符号。符号的意义是显然的,一眼可以看出。而数字的含义除非看文档或注释才能理解

(2)宏定义的目的和意义是:不用数字而用符号。从这里可以看出宏定义和枚举有内在联系。宏定义和枚举也被用来解决相似的问题,它们基本相当可以互换,但是有一些细微差别

三 :宏定义和枚举的区别

(1)枚举是把多个有关联的符号封装在一个枚举中,而宏定义是完全散的,也就是说枚举其实是多选一

(2)什么情况下用枚举?当我们要定义的常量是一个有限集合时(譬如一星期有七天,一个月有31天,一年有12个月......),最适合用枚举(其实用宏定义也行)

(3)不能用枚举的情况下(定义的符号常量无关联,或者无限的)用宏定义

总结:宏定义先出现,用来解决符号常量的问题:后来发现有时候一些宏定义彼此之间有关联(多选一的关系),用宏定义来做可以但不贴切,于是乎发明了枚举来解决这个问题。

四 :枚举的定义和使用

//可以用枚举类型声明符号名称来表示整型常量。使用enum关键字,可以创建一个新"类型"并指定它可具有
//的值(实际上,enum常量是int类型,因此,只要能使用int类型的地方就可以使用枚举类型)。
#include <stdio.h>

//枚举类型的目的是为了提高程序的可读性。它的语法与结构体的语法相同。可以如下:
enum spectrum                //创建了一个spectrum作为标记名,允许把enum spectrum作为
{                            //一个类型名来使用

    red,
    orange,
    yellow,
    green,
    blue,
    violet

};

enum spectrum color;         //使color作为enum spectrum类型的变量
                             //第一个声明中的花括号内的标识符枚举了spectrum可能有的值
                             //因此color可能是red、orange、yellow等。这些符号常量被称为
                             //枚举符。


int main(void)
{

            //可以这样使用
               int c;
               color = blue;
               if(color == yellow)
                    {

                          printf(" It's yellow");

                    }

                else
                    {    
                       printf(" Not yellow");
                       
                    }

             //虽然枚举符(如red和blue)是int类型,但是枚举变量可以是任意整数类型,前提是
             //该整数类型可以存储枚举变量。例如,spectrum的枚举范围是0~ 5,所以编译器可以用
             //unsigned char 来表示color变量


        
            //red和bule到底是什么?从技术层面看,它们是int类型的常量。例如,假定有前面的枚举
            //声明可以这样写
                
                printf("red = %d\n orange = %d\n",red,orange);

                //输出结果:red = 0 orange = 1
                //red成为一个一个有名称的常量,代表整数0,类似的,其他表标识符都是有名称的
                //常量分别代表1~5.只要是能使用整型常量的地方就可以使用枚举常量。例如,在声明
                //数组时,可以用枚举常量表示数组的大小;在switch语句中,可以把枚举常量作为标    
                //签
}


 enum的用法:枚举类型的目的是为了提高程序的可读性和可维护性。如果要处理颜色,使用red和bule比使用0和1更直观。注意,枚举类型只能在内部使用。如果要输入color中orange的值,只能输入1而不是单词orange。或者,让程序先读字符串"orange",再将其转换为orange所代表的值。

因为枚举是整数类型,所以可以在表达式中以使用整数变量的方式使用enum变量。它们用在case语句中很方便。

  • 8
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值