一、c++的enum工具提供了另一種建立符號常量的方式,這種方式可以代替const。它還允許定義新型別,但必須按嚴格的限制進行。使用enum的語法與使用結構類似。
例如:
enum spectrum ;
這句語法包含兩個意義:
1、讓spectrum成為新型別的名稱:spectrum被稱為列舉,就像struct被稱為結構一樣。
2、將red、orange、yellow等作為符號常量,它們對應整數值0~7。這些常量叫做列舉量。
注意:預設情況下,將整數值賦給列舉量,第乙個列舉量的值為0,第二個列舉量的值為1,以此類推。也可以通過顯式地指定整數值來覆蓋預設值。
二、列舉的特徵
1、可以用列舉名來宣告這種型別的變數。
spectrum band;
2、列舉變數在不進行強制型別轉換的情況下,只能將定義列舉時使用的列舉量賦給這種列舉的變數。
band = blue; 有效
band = 2000; 無效
因此,spectrum變數受到限制,只有8個可能的值。如果試圖將乙個非法值賦給它,則有些編譯器將出現編譯器錯誤,或者發出警告。
3、對於列舉,只定義了賦值運算子,沒有為列舉定義算術運算子。
band = orange; 有效
++band; 無效
band = orange + red; 無效
4、列舉量是整型,可被提公升為int型別,但int型別不能自動轉換為列舉型別。
int color = blue;有效
band = 3;無效
color = 3 + red;有效,red在這過程中轉換為int和3相加,並賦予了color(同樣是int型別)
三、設定列舉量的值
1、使用賦值運算子顯式地設定列舉量的值:
enum bits ;
2、指定的值必須是整數,也可以只顯式地定義其中一些列舉量的值:
enum bigstep ;
3、可以建立多個值相同的列舉量:
enum ;
四、列舉的取值範圍
對於列舉來說,只有宣告中指出的那些值是有效的。然而,c++現在通過強制型別轉換,增加了可賦給列舉變數的合法值。每個列舉值都有取值範圍(range),
通過強制型別轉換,可以將取值範圍中的任何整數值賦給列舉變數,即使這個值不是列舉值。
例如,enum bits ;
bits myflag;
則下面的**將是合法的:
myflag = bits(6);
其中6不是列舉值,但它位於列舉定義的取值範圍內。
取值範圍的定義如下。
(1)首先,要找出上限,需要知道列舉量的最大值。找到大於這個最大值的、最小的2的冪,將它減去1,得到的便是取值範圍的上限。
例如,前面定義的bigstep的最大值列舉值是101。在2的冪中,比這個數大的最小值為128,因此取值範圍的上限為127。
(2)要計算下限,需要知道列舉量的最小值。如
果它不小於0,則取值範圍的下限為0;否則,採用與尋找上限方式相同的方式,但加上負號。
例如,如果最小的列舉量為-6,而比它小的、最大的2的冪是-8(加上負號),因此下限為-7。
選擇用多少空間來儲存列舉由編譯器決定。對於取值範圍較小的列舉,使用乙個位元組或更少的空間;而對於包含long型別值的列舉,則使用4個位元組。
C學習筆記 列舉
可以使用列舉 enumerated type 宣告代表整數常量的符號名稱,關鍵字enum建立乙個新的列舉型別 實際上,enum常量是int型別的 列舉的本質就是int型的常量 enum spectrum 申明乙個列舉型別enum spectrum color 定義乙個列舉變數void func en...
C 學習筆記(十六)列舉
列舉 列舉是由使用者定義的值型別的資料型別。列舉只有一種資料型別成員 命名的整數值常量,預設為int。預設情況下,第乙個成員賦值為0,後續自增1。在列舉宣告中沒有分號,只有逗號分隔的列表。列舉的成員型別不能使用修飾符,他們隱式地具有和列舉相同的可訪問性。不能列舉成員之間不能做比較。1.設定底層型別和...
C 學習 列舉
c 中,所有列舉都是 system.enum 類的例項,system.enum不可以被派生。但是這個類有一些靜態方法,可以用來發現有關列舉例項中操作值的資訊。預設情況下,列舉中每個元素的基礎型別都為 int。可以使用冒號指定另一種整數型別 enum days byte 1 列舉能夠使 更加清晰,它允...