近期在寫數據結構的廣義表時候用到了這個概念,在學習C語言的時候沒有太注意們這里學一下。
我在網上結合了非常多資料,這里自己總結一下。
首先說。JAVA和C++中都有枚舉類型。
假設一個變量你須要幾種可能存在的值,那么就能夠被定義成為枚舉類型。之所以叫枚舉就是說將變量或者叫對象可能存在的情況也能夠說是可能的值一一例舉出來。
比如:
一個鉛筆盒中有一支筆,但在沒有打開之前你並不知道它是什么筆,可能是鉛筆也可能是鋼筆。
這里有兩種可能,那么你就能夠定義一個枚舉類型來表示它!
enum box{pencil,pen};
這個枚舉變量內含有兩個元素也稱枚舉元素在這里是pencil和pen,分別表示鉛筆和鋼筆。
假設你想定義兩個具有相同特性枚舉類型的變量那么你能夠用例如以下的兩種方式進行定義!
enum box{pencil,pen}; enum box box2;//或者簡寫成box box2; 再有一種就是在聲明的時候同一時候定義。enum {pencil,pen}box,box2; //在聲明的同一時候進行定義!
這里看起來非常像結構體;
枚舉變量中的枚舉元素系統是依照常量來處理的。故叫枚舉常量,
他們是不能進行普通的算術賦值的,(pencil=1;)這種寫發是錯誤的,
可是你能夠在聲明的時候進行賦值操作!
enum box{pencil=1,pen=2};
可是這里要特別注意的一點是,假設你不進行元素賦值操作那么元素將會被系統自己主動從0開始自己主動遞增的進行賦值操作,說到自己主動賦值,假設你僅僅定義了第一個那么系統將對下一個元素進行前一個元素的值加1操作
比如:
enum box{pencil=3,pen};//這里pen就是4系統將自己主動進行pen=4的定義賦值操作。
樣例:
//枚舉類型C語言 //楊鑫 #include <stdio.h> #include <stdlib.h> 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; }
C++實現:
#include <iostream> 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 <<endl; test = (enum egg) 0; //強制類型轉換 cout << "枚舉變量test值改變為:" << test <<endl; cin.get(); return 0; }
看到這里要最后說一個問題,就是枚舉變量中的枚舉元素(或者叫枚舉常量)在特殊情況下是會被自己主動提升為算術類型的!
枚舉類型 在實際問題中。有些變量的取值被限定在一個有限的范圍內。比如,一個星期內僅僅有七天,一年僅僅有十二個月, 一個班每周有六門課程等等。假設把這些量 說明為整型,字符型或其他類型顯然是不妥當的。為此。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; <span><span>j = (</span><span class="keyword">enum</span><span> body) (j + 1); </span></span> 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"); }