c语言enum枚举类型解析

c语言enum枚举类型解析

ID:30766956

大小:108.50 KB

页数:13页

时间:2019-01-03

上传者:U-991
c语言enum枚举类型解析_第1页
c语言enum枚举类型解析_第2页
c语言enum枚举类型解析_第3页
c语言enum枚举类型解析_第4页
c语言enum枚举类型解析_第5页
资源描述:

《c语言enum枚举类型解析》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

在实际应用屮,有的变量只有儿种可能取值。如人的性别只有两种可能取值,星期只有七种可能取值。在C语言中对这样取值比较特殊的变量可以定义为枚举类型。所谓枚举是指将变量的值一一列举出来,变量只限于列举出來的值的范围内取值。定义一个变量是枚举类型,对以先定义一个枚举类型名,然后再说明这个变量是该枚举类型。例如:enumweekday{sun,mon,tue,wed,thu,fri,sat}:定义了一个枚举类型名enumweekday,然示定义变量为该枚举类型。例如:enumweekdayday;当然,也町以直接定义枚举类型变量。例如:enumweekday{sun,mon5tue,wed,thu,fri,sat}day;其屮,sum,mon,...,sat等称为枚举元素或枚举常量,它们是用户定义的标识符。需要说明的有以卜•儿点。①枚举元素不是变量,而是常数,因此枚举元素又称为枚举常量。因为是常量,所以不能对枚举元素进行赋值。②枚举元素作为常量,它们是有值的,C语言在编译时按定义的顺序使它们的值为,1,2)...o在上而的说明屮,sun的值为0,mon的值为1,...sat的值为6,如果有赋值语句day=mon;则day变量的值为1。当然,这个变量值是可以输出的。例如:printf(”%d”,day);将输出整数1。如果在定义枚举类型时指定元索的值,也可以改变枚举元索的值。例如:enumweekday{sun=7,mon=1,tue,wed,thu,fri,sat}day;这时,sun为7,mon为1,以后元素顺次加1,所以sat就是6了。③枚举值可以用来作判断。例如:if(day==mon){...}if(day>mon){...}枚举值的比较规则是:按其在说明时的顺序号比较,如果说明时没有人为指定,则笫一个枚举元素的值认作0。例如,mon>sun,sat>frioC语言教程?216?④一个整数不能直接赋给一个枚举变量,必须强制进行类型转换才能赋值。例如:day=(enumweekday)2;这个赋值的意思是,将顺序号为2的枚举元素赋给day,相当于workday=tue;【例11.6]从键盘输入一个整数,显示与该整数对应的枚举常量的英文名称。#inelude voidmain(){enumweekday{sun,mon,tue,wed,thu,fri,sat}day;intk;printf("inputanumber(0-6)u);scanf(”%d”,&k);day=(enumweekday)k;switch(day){casesun:printfC'sunday/n");break;casemon:printf("monday/n”);break;casetue:printf("tuesday/rf');break:casewed:printf("Wednesday/rT);break;casethu:printf(nthursday/rT);break;casefri:printf("friday/nn);break:casesat:printf("satday/n”);break;default:printf("inputerror/n");break;}}程序运行结果为:inputanumber(0-6)1monday在该程序屮,枚举常量与枚举变量可以进行比较,但要输岀枚举常量对应的英文单词,不能使用以卜•语句:printf("%s”,mon);因为枚举常量mon为整数值,而非字符串。在使用枚举变量时,主要关心的不是它的值的大小,而是其表示的状态。注:以卜全部代码的执行坏境为VC++6.0在程序中,可能需要为某些整数定义一个别名,我们町以利用预处理指令#define来完成这项工作,您的代码可能是:#defineMON1 #defineTUE2#defineWED3#defineTHU4#defineFRI5#defineSAT6#defineSUN7在此,我们定义一种新的数据类型,希望它能完成同样的工作。这种新的数据类型叫枚举型。1.定义-•种新的数据类型-枚举型以下代码定义了这种新的数据类型■枚举型enumDAY{M0N=1,TUE,WED,THU,FRI,SAT,SUN};(1)枚举型是一个集合,集合中的元索(枚举成员)是一些命名的整型常量,元索之间川逗号,隔开。(2)DA丫是一个标识符,可以看成这个集合的名字,是一个对选项,即是可有町无的项。(3)笫一个枚举成员的默认值为整型的0,后续枚举成员的值在前一个成员上加1o(4)可以人为设定枚举成员的值,从而自定义某个范围内的整数。(5)枚举型是预处理指令#define的替代。(6)类型定义以分号;结束。2•使用枚举类烈对变量进行声明新的数据类型定义完成后,它就可以使用了。我们己经见过最基本的数据类型,如:整型int,单精度浮点型float,双精度浮点型double,字符型char,短整型short等等。用这些基本数据类型声明变量通帘是这样:chara;〃变量a的类型均为字符型char charletter;intx,y,乙〃变量x,y和z的类型均为整型intintnumber;doublem,n;doubleresult;〃变量result的类烈为双精度浮点型double既然枚举也是一种数据类型,那么它和基本数据类型一样也町以对变量进行声明。方法一:枚举类型的定义和变量的声明分开enumDAY{MON=1,TUE,WED,THU,FRI,SAT,SUN};enumDAYyesterday;enumDAYtoday;enumDAYtomorrow;〃变Mtomorrow的类型为枚举型enumDAYenumDAYgood_day,badday;〃变量goodday和badday的类型均为枚举型enumDAY方法二:类型定义与变量声明同时进行:enumW第一个定义不同的是,此处的标号DAY省略,这是允许的。{Saturday,Sunday=0,monday,tuesday,Wednesday,thursday,friday}workday;〃变量workday的类型为枚举型enumDAY enumweek{Mon=1,Tue,Wed,Thu,FriSat,Sun}days;//变量days的类型为枚举型enumweekenumBOOLEAN{false,true}end_flag5match_flag;〃定义枚举类黑并声明了两个枚举烈变量方法三:川typedef关键字将枚举类型定义成别名,并利川该别名进行变量声明:typedefenumworkday{Saturday,sunday=0,monday,tuesday,Wednesday,thursday,friday}workday;〃此处的workday为枚举烈enumworkday的别名workdaytoday,tomorrow;〃变量today和tomorrow的类型为枚举型workday,也即enumworkdayenumworkday中的workday可以省略:typedefenum{Saturday,Sunday=0,monday,tuesday,Wednesday,thursday,friday}workday;〃此处的workday为枚举型enumworkday的别名 workdaytoday,tomorrow;〃变量today和tomorrow的类型为枚举型workday,也即enumworkday也可以用这种方式:typedefenumworkday{Saturday,Sunday=0,monday,tuesday,Wednesday,thursday,friday};workdaytoday,tomorrow;〃变量today和tomorrow的类型为枚举型workday,也即enumworkday注意:同一个程序中不能定义同名的枚举类型,不同的枚举类型中也不能存在同名的命名常量。错误示例如卜•所示:错课声明一:存在同名的枚举类型typedefenum{Wednesday,thursday,friday}workday;typedefenumWEEK{Saturday,Sunday=0,monday,}workday; 错误芦明二:存在同名的枚举成员typedefenum{Wednesday,thursday,friday}workday_1;typedefenumWEEK{Wednesday,Sunday=0,monday,}workday_2;3.使用枚举类烈的变量3.1对枚举型的变量赋值。实例将枚举类羽的赋值与基本数据类烈的赋值进行了对比:方法一:先声明变量,再对变量赋值#include/*定义枚举类型*/enumDAY{MON=1,TUE,WED,THU,FRI,SAT,SUN};voidmain(){广使用基木数据类型声明变量,然示对变量赋值*/intx,y,z;x=10;y=20;z=30;广使用枚举类型声明变量,再对枚举型变量赋值*/enumDAYyesterday,today,tomorrow; yesterday=MON;today=TUE;tomorrow=WED;printf(H%d%d%d/n”,yesterday,today,tomorrow);}方法二:声明变量的同时赋初值#include/*定义枚举类型*/enumDAY{MON=1,TUE,WED,THU,FRI,SAT,SUN};voidmain(){广使用基木数据类型声明变量同时对变最赋初值*/intx=10,y=20,z=30;广使用枚举类型肖明变量同时对枚举型变量赋初值*/enumDAYyesterday=MON,today=TUE,tomorrow=WED;printf(H%d%d%d/n”,yesterday,today,tomorrow);}方法三:定义类型的同时声明变量,然后对变量赋值。#include广定义枚举类型,同时声明该类型的三个变量,它们都为全局变蜃*/enumDAY{MON=1,TUE,WED,THU,FRI,SAT,SUN}yesterday,today,tomorrow;/*定义三个具有基本数据类型的变量,它们都为全局变量*/intx,y,z;voidmain()r对基本数据类型的变量赋值7x=10;y=20;z=30;/*对枚举烈的变量赋值*/yesterday=MON; today=TUE;tomorrow=WED;printf("%d%d%d/nH,x,y,z);〃输出:102030printf(n%d%d%d/n”,yesterday,today,tomorrow);〃输出:123}方法四:类型定义,变量声明,赋初值同时进行。#include广定义枚举类型,同时声叨该类型的三个变量,并赋初值。它们都为全局变量*/enumDAY{MON=1,TUE,WED,THU,FRI,SAT,SUN}yesterday=MON,today=TUE,tomorrow=WED;广定义三个具有基本数据类型的变量,并赋初值。它们都为全局变量少/intx=10,y=20,z=30;voidmain(){printf("%d%d%d/rT,x,y,z);//输出:102030printf("%d%d%d/n",yesterday,today,tomorrow);//输出:1233.2对枚举型的变量赋整数值时,需要进行类型转换。includeenumDAY{M0N=1,TUE,WED,THU,FRI,SAT,SUN};voidmain(){enumDAYyesterday,today,tomorrow; yesterday=TUE;today=(enumDAY)(yesterday+1);〃类型转换tomorrow=(enumDAY)30;〃类型转换//tomorrow=3;//错误printf("%d%d%d/n",yesterday,today,tomorrow);〃输出:2330}3.3使用枚举型变量#includeenum{BELL=7a;BACKSPACE=7bHTAB=7tRETURN=7r*,NEWLINE=7”,VTAB=7vSPACE='*};enumBOOLEAN{FALSE=0,TRUE}match」lag;voidmain(){intindex=0;intcount_of_letter=0;intcount_of_space=0;charstr[]=*TmElyefod";match_flag=FALSE;for(;str[index]!=70';index++)if(SPACE!=str[index])count_of_letter++;else{matchflag=(enumBOOLEAN)1;count_of_space++; }printf("%s%dtimes%c",match_flag?"match":"notmatch",count_of_space,NEWLINE);printf(ucountofletters:%d%c%c”,count_of_letter,NEWLINE,RETURN);}输出:match2timescountofletters:10Pressanykeytocontinue3.枚举类型与sizeof运算符#includeenumescapes{BELL=7a;BACKSPACE=7b;HTAB=7t;RETURN=7rNEWLINE=7n',VTAB=7vSPACE=*•};enumBOOLEAN{FALSE=0,TRUE}matchJlag;voidmain()printf("%dbytes/n”,sizeof(enumescapes));//4bytesprintf("%dbytes/n",sizeof(escapes));//4bytesprintf("%dbytes/n",sizeof(enumBOOLEAN));//4bytesprintf("%dbytes/nn,sizeof(BOOLEAN));//4bytesprintf("%dbytes/n",sizeof(match_flag));//4bytesprintf("%dbytes/n",sizeof(SPACE));//4bytesprintf("%dbytes/n",sizeof(NEWLINE));//4bytes printf("%dbytes/n",sizeof(FALSE));//4bytesprintf("%dbytes/n”,sizeof(O));//4bytes}3.综合举例#includeenumSeason{spring,summer=100,fall=96,winter};typedefenum{Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday}Weekday;voidmain(){/*Season*/printf("%d/n",spring);//0printf(n%d3%c/nn,summer,summer);//100,dprintf("%d/nM,fall+winter);//193SeasonmySeason=winter;if(winter==mySeason)printf(HmySeasoniswinter/rT);//mySeasoniswinterintx=100;if(x==summer)printf(Hxisequaltosummer/rT);//xisequaltosummerprintf(n%dbytes/n”,sizeof(spring));//4bytes/*Weekday*/printf(HsizeofWeekdayis:%d/n'sizeof(Weekday));//sizeofWeekdayis:4Weekdaytoday=Saturday;Weekdaytomorrow; if(today==Monday)tomorrow=Tuesday;elsetomorrow=(Weekday)(today+1);//remembertoconvertfrominttoWeekday}

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。
大家都在看
近期热门
关闭