c語(yǔ)言枚舉的用法
時(shí)間:
長(zhǎng)思709由 分享
在程序中,可能需要為某些整數(shù)定義一個(gè)別名,我們可以利用預(yù)處理指令#define來(lái)完成這項(xiàng)工作,您的代碼可能是:
#defineMON1
#defineTUE 2
#defineWED3
#defineTHU 4
#defineFRI 5
#defineSAT 6
#defineSUN 7
在此,我們定義一種新的數(shù)據(jù)類(lèi)型,希望它能完成同樣的工作。這種新的數(shù)據(jù)類(lèi)型叫枚舉型。下面小編就為大家介紹下c語(yǔ)言枚舉的用法。
c語(yǔ)言枚舉的用法如下:
c語(yǔ)言枚舉的用法如下:
1. 定義一種新的數(shù)據(jù)類(lèi)型 - 枚舉型
以下代碼定義了這種新的數(shù)據(jù)類(lèi)型 - 枚舉型
enumDAY
{
MON=1,TUE,WED,THU,FRI,SAT,SUN
};
(1) 枚舉型是一個(gè)集合,集合中的元素(枚舉成員)是一些命名的整型常量,元素之間用逗號(hào),隔開(kāi)。
(2) DAY是一個(gè)標(biāo)識(shí)符,可以看成這個(gè)集合的名字,是一個(gè)可選項(xiàng),即是可有可無(wú)的項(xiàng)。
(3) 第一個(gè)枚舉成員的默認(rèn)值為整型的0,后續(xù)枚舉成員的值在前一個(gè)成員上加1。
(4) 可以人為設(shè)定枚舉成員的值,從而自定義某個(gè)范圍內(nèi)的整數(shù)。
(5) 枚舉型是預(yù)處理指令#define的替代。
(6) 類(lèi)型定義以分號(hào);結(jié)束。
2. 使用枚舉類(lèi)型對(duì)變量進(jìn)行聲明
新的數(shù)據(jù)類(lèi)型定義完成后,它就可以使用了。我們已經(jīng)見(jiàn)過(guò)最基本的數(shù)據(jù)類(lèi)型,如:整型int, 單精度浮點(diǎn)型float, 雙精度浮點(diǎn)型double, 字符型char, 短整型short等等。用這些基本數(shù)據(jù)類(lèi)型聲明變量通常是這樣:
char a;//變量a的類(lèi)型均為字符型char
char letter;
int x,
y,
z;//變量x,y和z的類(lèi)型均為整型int
int number;
double m,n;
double result;//變量result的類(lèi)型為雙精度浮點(diǎn)型double
既然枚舉也是一種數(shù)據(jù)類(lèi)型,那么它和基本數(shù)據(jù)類(lèi)型一樣也可以對(duì)變量進(jìn)行聲明。
方法一:枚舉類(lèi)型的定義和變量的聲明分開(kāi)
enumDAY
{
MON=1,TUE,WED,THU,FRI,SAT,SUN
};
enumDAYyesterday;
enumDAYtoday;
enumDAYtomorrow;//變量tomorrow的類(lèi)型為枚舉型enumDAY
enumDAYgood_day,bad_day;//變量good_day和bad_day的類(lèi)型均為枚舉型enumDAY
方法二:類(lèi)型定義與變量聲明同時(shí)進(jìn)行:
enum//跟第一個(gè)定義不同的是,此處的標(biāo)號(hào)DAY省略,這是允許的。
{
saturday,
sunday=0,
monday,
tuesday,
wednesday,
thursday,
friday
}workday;//變量workday的類(lèi)型為枚舉型enumDAY
enumweek{Mon=1,Tue,Wed,Thu,FriSat,Sun}days;//變量days的類(lèi)型為枚舉型enumweek
enumBOOLEAN{false,true}end_flag,match_flag;//定義枚舉類(lèi)型并聲明了兩個(gè)枚舉型變量
方法三:用typedef關(guān)鍵字將枚舉類(lèi)型定義成別名,并利用該別名進(jìn)行變量聲明:
typedefenumworkday
{
saturday,
sunday=0,
monday,
tuesday,
wednesday,
thursday,
friday
}workday;//此處的workday為枚舉型enumworkday的別名
workdaytoday,tomorrow;//變量today和tomorrow的類(lèi)型為枚舉型workday,也即enumworkday
enum workday中的workday可以省略:
typedefenum
{
saturday,
sunday=0,
monday,
tuesday,
wednesday,
thursday,
friday
}workday;//此處的workday為枚舉型enumworkday的別名
workdaytoday,tomorrow;//變量today和tomorrow的類(lèi)型為枚舉型workday,也即enumworkday
也可以用這種方式:
typedefenumworkday
{
saturday,
sunday=0,
monday,
tuesday,
wednesday,
thursday,
friday
};
workdaytoday,tomorrow;//變量today和tomorrow的類(lèi)型為枚舉型workday,也即enumworkday
注意:同一個(gè)程序中不能定義同名的枚舉類(lèi)型,不同的枚舉類(lèi)型中也不能存在同名的命名常量。錯(cuò)誤示例如下所示:
錯(cuò)誤聲明一:存在同名的枚舉類(lèi)型
typedefenum
{
wednesday,
thursday,
friday
}workday;
typedefenumWEEK
{
saturday,
sunday=0,
monday,
}workday;
錯(cuò)誤聲明二:存在同名的枚舉成員
typedefenum
{
wednesday,
thursday,
friday
}workday_1;
typedefenumWEEK
{
wednesday,
sunday=0,
monday,
}workday_2;
3. 使用枚舉類(lèi)型的變量
3.1 對(duì)枚舉型的變量賦值。
實(shí)例將枚舉類(lèi)型的賦值與基本數(shù)據(jù)類(lèi)型的賦值進(jìn)行了對(duì)比:
方法一:先聲明變量,再對(duì)變量賦值
#include<stdio.h>
/*定義枚舉類(lèi)型*/
enumDAY{MON=1,TUE,WED,THU,FRI,SAT,SUN};
voidmain()
{
/*使用基本數(shù)據(jù)類(lèi)型聲明變量,然后對(duì)變量賦值*/
intx,y,z;
x=10;
y=20;
z=30;
/*使用枚舉類(lèi)型聲明變量,再對(duì)枚舉型變量賦值*/
enumDAYyesterday,today,tomorrow;
yesterday=MON;
today=TUE;
tomorrow=WED;
printf("%d%d%d\n",yesterday,today,tomorrow);
}
方法二:聲明變量的同時(shí)賦初值
#include <stdio.h>
/*定義枚舉類(lèi)型*/
enumDAY{MON=1,TUE,WED,THU,FRI,SAT,SUN};
voidmain()
{
/*使用基本數(shù)據(jù)類(lèi)型聲明變量同時(shí)對(duì)變量賦初值*/
intx=10,y=20,z=30;
/*使用枚舉類(lèi)型聲明變量同時(shí)對(duì)枚舉型變量賦初值*/
enumDAYyesterday=MON,
today=TUE,
tomorrow=WED;
printf("%d%d%d\n",yesterday,today,tomorrow);
}
方法三:定義類(lèi)型的同時(shí)聲明變量,然后對(duì)變量賦值。
#include<stdio.h>
/*定義枚舉類(lèi)型,同時(shí)聲明該類(lèi)型的三個(gè)變量,它們都為全局變量*/
enumDAY{MON=1,TUE,WED,THU,FRI,SAT,SUN}yesterday,today,tomorrow;
/*定義三個(gè)具有基本數(shù)據(jù)類(lèi)型的變量,它們都為全局變量*/
intx,y,z;
voidmain()
{
/*對(duì)基本數(shù)據(jù)類(lèi)型的變量賦值*/
x=10;y=20;z=30;
/*對(duì)枚舉型的變量賦值*/
yesterday=MON;
today=TUE;
tomorrow=WED;
printf("%d%d%d\n",x,y,z);//輸出:102030
printf("%d%d%d\n",yesterday,today,tomorrow);//輸出:123
}
方法四:類(lèi)型定義,變量聲明,賦初值同時(shí)進(jìn)行。
#include<stdio.h>
/*定義枚舉類(lèi)型,同時(shí)聲明該類(lèi)型的三個(gè)變量,并賦初值。它們都為全局變量*/
enumDAY
{
MON=1,
TUE,
WED,
THU,
FRI,
SAT,
SUN
}
yesterday=MON,today=TUE,tomorrow=WED;
/*定義三個(gè)具有基本數(shù)據(jù)類(lèi)型的變量,并賦初值。它們都為全局變量*/
intx=10,y=20,z=30;
voidmain()
{
printf("%d%d%d\n",x,y,z);//輸出:102030
printf("%d%d%d\n",yesterday,today,tomorrow);//輸出:123
}
3.2 對(duì)枚舉型的變量賦整數(shù)值時(shí),需要進(jìn)行類(lèi)型轉(zhuǎn)換。
#include<stdio.h>
enumDAY{MON=1,TUE,WED,THU,FRI,SAT,SUN};
voidmain()
{
enumDAYyesterday,today,tomorrow;
yesterday=TUE;
today=(enumDAY)(yesterday+1);//類(lèi)型轉(zhuǎn)換
tomorrow=(enumDAY)30;//類(lèi)型轉(zhuǎn)換
//tomorrow=3;//錯(cuò)誤
printf("%d%d%d\n",yesterday,today,tomorrow);//輸出:2330
}
3.3 使用枚舉型變量
#include<stdio.h>
enum
{
BELL='\a',
BACKSPACE='\b',
HTAB ='\t',
RETURN ='\r',
NEWLINE ='\n',
VTAB ='\v',
SPACE =''
};
enumBOOLEAN{FALSE=0,TRUE}match_flag;
voidmain()
{
intindex=0;
intcount_of_letter=0;
intcount_of_space=0;
charstr[]="I'mElyefod";
match_flag=FALSE;
for(;str[index]!='\0';index++)
if(SPACE!=str[index])
count_of_letter++;
else
{
match_flag=(enumBOOLEAN)1;
count_of_space++;
}
printf("%s%dtimes%c",match_flag"match":"notmatch",count_of_space,NEWLINE);
printf("countofletters:%d%c%c",count_of_letter,NEWLINE,RETURN);
}
輸出:
match 2 times
count of letters: 10
Press any key to continue
4.枚舉類(lèi)型與sizeof運(yùn)算符
#include <stdio.h>
enumescapes
{
BELL='\a',
BACKSPACE='\b',
HTAB='\t',
RETURN='\r',
NEWLINE='\n',
VTAB='\v',
SPACE=''
};
enumBOOLEAN{FALSE=0,TRUE}match_flag;
voidmain()
{
printf("%dbytes\n",sizeof(enumescapes));//4bytes
printf("%dbytes\n",sizeof(escapes));//4bytes
printf("%dbytes\n",sizeof(enumBOOLEAN));//4bytes
printf("%dbytes\n",sizeof(BOOLEAN));//4bytes
printf("%dbytes\n",sizeof(match_flag));//4bytes
printf("%dbytes\n",sizeof(SPACE));//4bytes
printf("%dbytes\n",sizeof(NEWLINE));//4bytes
printf("%dbytes\n",sizeof(FALSE));//4bytes
printf("%dbytes\n",sizeof(0));//4bytes
}
5.綜合舉例
#include<stdio.h>
enumSeason
{
spring,summer=100,fall=96,winter
};
typedefenum
{
Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday
}
Weekday;
voidmain()
{
/*Season*/
printf("%d\n",spring);//0
printf("%d,%c\n",summer,summer);//100,d
printf("%d\n",fall+winter);//193
SeasonmySeason=winter;
if(winter==mySeason)
printf("mySeasoniswinter\n");//mySeasoniswinter
intx=100;
if(x==summer)
printf("xisequaltosummer\n");//xisequaltosummer
printf("%dbytes\n",sizeof(spring));//4bytes
/*Weekday*/
printf("sizeofWeekdayis:%d\n",sizeof(Weekday));//sizeofWeekdayis:4
Weekdaytoday=Saturday;
Weekdaytomorrow;
if(today==Monday)
tomorrow=Tuesday;
else
tomorrow=(Weekday)(today+1);//remembertoconvertfrominttoWeekday
}