亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

枚舉的用法詳細總結

2020-01-24 02:54:02
字體:
來源:轉載
供稿:網友

1、枚舉enum的用途淺例
寫程序時,我們常常需要為某個對象關聯一組可選alternative屬性.例如,學生的成績分A,B,C,D等,天氣分sunny, cloudy, rainy等等。
更常見的,打開一個文件可能有三種狀態:input, output和append. 典型做法是,對應定義3個常數,即:
const int input = 1;
const int output = 2;
const int append = 3;
然后,調用以下函數:
bool open_file(string file_name, int open_mode);
比如,
open_file("Phenix_and_the_Crane", append);
這種做法比較簡單,但存在許多缺點,主要的一點就是無法限制傳遞給open_file函數的第2個參數的取值范圍,只要傳遞int類型的值都是合法的。(當然,這樣的情況下的應對措施就是在open_file函數內部判斷第二個參數的取值,只有在1,2,3范圍內才處理。)
使用枚舉能在一定程度上減輕這種尷尬(注1),它不但能實現類似于之前定義三個常量的功能,還能夠將這三個值組合起來成為獨一無二的組。例如:
enum open_modes {input = 1, output, append};
以上定義了open_modes為枚舉類型enumeration type。每一個命名了的枚舉都是唯一的類型,是一個類型標示器type specifier。例如,我們可以重新寫一個open_file函數:
bool open_file(string file_name, open_modes om);
在open_modes枚舉中,input, output, append稱為枚舉子enumerator, 它們限定了open_modes定義的對象的取值范圍。這個時候,調用open_file函數和之前的方法還是一模一樣:
open_file("Phenix_and_the_Crane", append);
但是,如果傳遞給open_file的第二個參數不是open_modes枚舉類型值的話(注1),那么編譯器就會識別出錯誤;就算該參數取值等價于input, output, append中的某個,也一樣會出錯哦!例如:
open_file("Phenix_and_the_Crane", 1);

2、枚舉的定義
一個枚舉是一個類型,可以保存一組由用戶刻畫的值。定義之類,枚舉的使用很像一個整數類型。
枚舉的定義具有以下形式,即以關鍵詞enum開頭,接著一個可選的枚舉名,下來是由大括號{}包含著一個由逗號分隔的枚舉子列表enumerators list:
enum [enumeration name] {enumerator1[=value1], enumerator2[=value2], ...};

3、枚舉子的類型和取值
枚舉子的類型就是它所在的那個枚舉,例如前面說到的open_modes枚舉中,input,output和append等枚舉子的類型都是open_modes。這種做法,其實是為了賦予用戶和編譯器一些有關該變量擬議中的用途的提示。
默認下,第一個枚舉子被賦值0,接下來的枚舉子取值是前面一個枚舉子的取值+1,例如:
enum weather {sunny, cloudy, rainy, windy};
其中
      sunny == 0,
      cloudy == 1,
      rainy == 2,
      windy == 3;
以上是默認情況,有時候我們希望顯式地指定某個枚舉子的值,那么會出現什么情況呢?看看:
enum some_fruit {apple = 3, orange, banana = 4, bear};
好了,apple == 3, banana == 4; 那么orange和bear呢?記得前面說過一句,默認下”接下來的枚舉子取值是前面一個枚舉子的取值+1“。既然這兩個枚舉子沒有顯式賦值,那么就按照默認規則辦事,所以 orange == 4, bear == 5.

從這個例子也可以看出,同一枚舉中枚舉子的取值不需要唯一。這樣有什么用處呢?下面是個簡單的例子:

復制代碼 代碼如下:

enum some_big_cities {
                                               Guangzhou = 4,
                                               Shenzhen    = 4,
                                               Hongkong   = 4,
                                               Shanghai    = 2,
                                               Beijing         = 3,
                                               Chongqi      = 3
                                           };

以上簡單地按區域,將五個城市按照華南(4),華東(2), 華北(3)的幾個城市分類了。

4、枚舉變量的定義、初始化和賦值
既然每個枚舉都是一個類型,那么由這個類型自然可以聲明變量,例如,由前面定義的some_big_cities:
some_big_cities where_I_am;
需要注意的是,在聲明where_I_am時沒有初始化,如果這時打印where_I_am的值:

復制代碼 代碼如下:

enum some_big_cities {
                                            Guangzhou = 4,
                                            Shenzhen = 4,
                                            Hongkong = 4,
                                            Shanghai = 2,
                                            Beijing = 3,
                                            Chongqi = 5};
int main(void)
{
     some_big_cities wh;
     cout<<"the value is: "<<wh<<endl;
     return 0;
}

輸出將是the value is: 1. 然而,如果聲明wh為全局變量,則另一種情況:
復制代碼 代碼如下:

enum some_big_cities {Guangzhou = 1 Shenzhen = 1, Hongkong = 1,
                                       Shanghai = 2, Beijing = 3, Chongqi = 5};
some_big_cities wh;
int main(void)
{
   cout<<"the value is: "<<wh<<endl;
   return 0;
}

輸出將是the value is: 0;

以上結果是在Visual C++ 2005 Express中得到,不知道其它編譯器情況如何,也不知為什么得到這樣的結果。下來再找找資料。
定義一個枚舉變量時,可以給它初始化,例如:
some_big_cities wh = Guangzhou;
注意等號右邊只能取枚舉子中的某一個;特別地,以Guangzhou為例,雖然Guangzhou==4, 但以下初始化是出錯的:
some_big_cities wh = 4;
Visual C++ 2005編譯器提示:
error C2440: 'initializing' : cannot convert from 'int' to 'some_big_cities'
可見,不能直接地把一個整型賦值給一個枚舉變量,因為枚舉和整型是不同類型的,除非顯式轉換。關于枚舉與整型的關系,后面再講。

除了初始化,枚舉變量也有賦值運算:
     some_big_cities wh;
     wh = Guangzhou;
     wh = Shanghai;
或者
    some_big_cities wh1 = Guangzhou;
    some_big_cities wh2 = Shanghai;
    wh2 = wh1;


5、枚舉的取值范圍
如果某個枚舉中所有枚舉子的值均非負,該枚舉的表示范圍就是[0:2^k-1],其中2^k是能使所有枚舉子都位于此范圍內的最小的2的冪;如果存在負的枚舉值,該枚舉的取值范圍就是[-2^k,2^k-1].例如:
   enum e1 {dark, light}; //范圍0:1
   enum e3 {min = -10, max = 1000}; //范圍-1024:1023

6、枚舉與整型的關系
整型值只能顯式地轉換成一個枚舉值,但是,如果轉換的結果位于該枚舉取值范圍之外,則結果是無定義的。
     enum e1 {dark = 1, light = 10};
     e1 VAR1 = e1(50); //無定義
     e1 VAR2 = e1(3); //編譯通過
在這里也說明了不允許隱式地從整型轉換到枚舉的原因,因為大部分整型值在特定的枚舉里沒有對應的表示。
至于枚舉可以當作特定的整型數來用的例子,從open_modes可以體會。

7、自定義運算符
枚舉是用戶自定義類型,所以在用戶可以為它定義自身的操作,例如++或者<<等。但是,在沒有定義之前,不能因為枚舉像整型就可以默認使用,例如:

復制代碼 代碼如下:

   enum SomeCities
{
   zhanjiang,
   Maoming,
   Yangjiang,
   Jiangmen,
   Zhongshan
};
SomeCities oneCity;
for (oneCity = zhanjiang; oneCity != Zhongshan; ++oneCity)
{
   cout<<oneCity<<endl;
}

以上的++OneCity是沒有定義的,在Visual C++ 6 編譯下得到如下錯誤:
error C2675: unary '++' : 'enum main::SomeCities' does not define this operator or a conversion to a type acceptable to the predefined operator

8、Sizeof
一個枚舉類型的sizeof就是某個能夠容納其范圍的整型的sizeof, 而且不會大于sizeof(int), 除非某個枚舉子的值不能用int或者unsigned int來表示。

在32位機器中,sizeof(int)一般等于4。前面介紹的所有枚舉,例如,

復制代碼 代碼如下:

enum SomeCities
{
   zhanjiang,
   Maoming,
   Yangjiang,
   Jiangmen,
   Zhongshan
};

計算其sizeof, 可能是1,也可能是是4。在我的intel E2160雙核、32位機器中,得到4。
-----------------------------------------------------------------------------------
[注1, Begin]
由于通過將整型數顯式轉換就可能得到對應枚舉類型的值,所以聲明一個枚舉來達到限制傳遞給函數的參數取值范圍還是力不從心的,
以下是一個例子:
復制代碼 代碼如下:

enum SomeCities
{
zhanjiang=1, //1
Maoming,     //2
Yangjiang,   //3
Jiangmen,   //4
Zhongshan = 1000 //1000
};
void printEnum(SomeCities sc)
{
cout<<sc<<endl;
}
int main(void)
{
SomeCities oneCity = SomeCities(50); //將50通過顯式轉換,為oneCity賦值
printEnum(oneCity); //在VC++ 6 編譯器下得到50輸出
return 0;
}

以上例子說明,雖然SomeCities的定義里沒有賦值為50的枚舉值,但是,由于50在該枚舉的取值范圍內,所以通過顯式聲明得到一個有定義的枚舉值,從而成功傳遞給printEnum函數。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
色悠悠久久88| 欧美二区在线播放| 国产精品美女视频网站| 亚洲一区二区三区视频播放| 国产精品三级美女白浆呻吟| 欧美日韩在线影院| 97色在线播放视频| 最近2019中文字幕一页二页| 久久男人资源视频| 国产精品一区二区女厕厕| 欧美黄色小视频| 中文字幕日韩有码| 亚洲最大的成人网| 久久久久国产一区二区三区| 欧美日韩亚洲高清| 国产精品久久二区| 久久久久久久久久久国产| 国产精品美女久久| 日本精品一区二区三区在线播放视频| 91理论片午午论夜理片久久| 亲爱的老师9免费观看全集电视剧| 亚洲精品美女在线观看| 欧洲s码亚洲m码精品一区| 91老司机在线| 欧美网站在线观看| 伊人av综合网| 国产99视频精品免视看7| 国产成人精品优优av| 日韩中文字幕免费看| 中文在线不卡视频| 国产成人精品在线| 亚洲精品国产精品国自产观看浪潮| 国产精品都在这里| 欧美性猛交xxxx黑人猛交| 国产精品小说在线| 国精产品一区一区三区有限在线| 国产日产欧美精品| 欧美另类交人妖| 国产精品第三页| 亚洲视频999| 欧美日韩一区二区免费在线观看| 欧美日韩国产中字| 一本色道久久综合狠狠躁篇怎么玩| 亚洲免费伊人电影在线观看av| 日韩一级黄色av| 日韩经典一区二区三区| 久久精品91久久久久久再现| 中文字幕亚洲专区| 欧美做受高潮1| 国产精品精品视频一区二区三区| 狠狠久久五月精品中文字幕| 日韩欧美在线视频免费观看| 成人午夜一级二级三级| 久久琪琪电影院| 成人欧美一区二区三区黑人孕妇| 精品久久久久久久久久久久| 欧美精品一区二区三区国产精品| 91高清免费在线观看| 91精品国产乱码久久久久久久久| 日韩午夜在线视频| 一个人看的www久久| 亚洲成av人乱码色午夜| 欧美性生交大片免费| 久久精品国产精品亚洲| 国产精品久久视频| 亚洲综合色av| 亚洲欧洲日产国产网站| 久久国产精品偷| 97国产精品免费视频| 91久久精品国产91久久| 国产成人鲁鲁免费视频a| 亚洲国产精品久久久久秋霞蜜臀| 久久99国产精品自在自在app| 亚洲欧美变态国产另类| 国产亚洲福利一区| 日韩中文字幕免费| 国产91免费观看| 中文字幕精品—区二区| 亚洲精品网址在线观看| 亚洲美女av网站| 亚洲精品久久久久中文字幕欢迎你| 欧美影院久久久| 国产成人鲁鲁免费视频a| 国产精品v日韩精品| 日韩av在线免费看| 欧美极品少妇xxxxⅹ裸体艺术| 国产精品久久久999| 亚洲美女激情视频| 精品欧美aⅴ在线网站| 成人在线精品视频| 久久久电影免费观看完整版| 欧美激情精品久久久久久变态| 亚洲一区二区三| 国产精品18久久久久久麻辣| 91天堂在线视频| 国产日韩欧美自拍| 亚洲在线观看视频网站| 亚洲国产成人精品电影| 国产日韩中文字幕在线| 91精品在线国产| 国产脚交av在线一区二区| 日韩精品福利在线| 欧美亚洲激情视频| 欧美日韩性生活视频| 日韩电影大全免费观看2023年上| 欧美成在线观看| 国产精品视频专区| 欧美日韩亚洲国产一区| 久久理论片午夜琪琪电影网| 国产成人精品综合久久久| 国产精品啪视频| 亚洲欧美日韩成人| 亚洲高清久久久久久| 国产a级全部精品| 国模私拍一区二区三区| 亚洲午夜未满十八勿入免费观看全集| 亚洲毛片在线观看.| 国产日韩欧美夫妻视频在线观看| 亚洲va男人天堂| 欧美成人免费一级人片100| 欧美午夜视频在线观看| 国产成人自拍视频在线观看| 亚洲自拍偷拍福利| 久久精品视频在线播放| 欧美日韩国产综合视频在线观看中文| 91精品久久久久久久久久| 九九热最新视频//这里只有精品| 国产精品第2页| 国产精品盗摄久久久| 国产精品美女视频网站| 亚洲一区亚洲二区| 亚洲福利在线观看| 最近2019中文字幕第三页视频| 色综合久久中文字幕综合网小说| 欧美激情一级欧美精品| 亚洲国产欧美精品| 岛国av午夜精品| 欧美性色视频在线| 亚洲一二三在线| 国产精品久久久久99| 色青青草原桃花久久综合| 91精品国产亚洲| 国产一级揄自揄精品视频| 亚洲视频专区在线| 久久97久久97精品免视看| 国自在线精品视频| 亚洲欧美日韩精品久久亚洲区| 欧美在线视频在线播放完整版免费观看| 成人午夜一级二级三级| 欧美激情欧美激情在线五月| 欧美乱大交xxxxx另类电影| 日韩免费在线观看视频| 亚洲91精品在线观看| 国产亚洲精品综合一区91| 亚洲一级一级97网| 夜夜嗨av色一区二区不卡| www亚洲精品| 久久久久五月天| 黄色成人av网| 97色在线视频观看| 在线播放精品一区二区三区| 欧美重口另类videos人妖| 日韩在线资源网| 日韩电视剧在线观看免费网站|