c 列舉變數詳解

2021-09-30 15:50:25 字數 3973 閱讀 8232

眾所周知,c/c++語言可以使用#define和const建立符號常量,而使用enum工具不僅能夠建立符號常量,還能定義新的資料型別,但是必須按照一定的規則進行,下面我們一起看下enum的使用方法。

(1)首先,請看下面的語句:

enum enumtype ;

這句話有兩個作用:

第一:宣告enumtype為新的資料型別,稱為列舉(enumeration);

第二:宣告monday、tuesday等為符號常量,通常稱之為列舉量,其值預設分別為0-6。(後面會介紹怎樣顯式的初始化列舉量的值)

(2)接著利用新的列舉型別enumtype宣告這種型別的變數:enumtype weekday'就像使用基本變數型別int宣告變數一樣,如 int a;也可以在定義列舉型別時定義列舉變數enum enumtype weekday;

然而與基本變數型別不同的地方是,在不進行強制轉換的前提下,只能將定義的列舉量賦值給該種列舉的變數,如:weekday = monday;或者weekday = sunday;不能將其他值賦給列舉變數,如:weekday = 10;這是不允許的,因為10不是列舉量。也就是說weekday只能是定義的monday-sunday這些定義過的列舉量。然而這不是絕對的,第六條會講到利用強制型別轉換將其他型別值賦給列舉變數

(3)上面講不能將非列舉量賦給列舉變數,那麼能不能將列舉量賦給非列舉變數呢?如:int a=monday;這是允許的,因為列舉量是符號常量,這裡的賦值編譯器會自動把列舉量轉換為int型別。

(4)前面講可以對列舉進行賦值運算,那列舉變數能不能進行算術運算呢?

weekday++;weekday = monday + tuesday;這是非法的,因為這些操作可能導致違反型別限制,比如:weekday = sunday;

weekday++;weekday首先被賦予列舉量中的最後乙個值sunday(值為6),再進行遞增的話,weekday增加到7,而對於enumtype型別來說,7是無效的。

總結:對於列舉,只定義了賦值運算子,沒有為列舉定義算術運算。

(5)不能對列舉量進行算術運算,那麼列舉量能不能參與其他型別變數的運算呢?int a;a = 1 + monday;這是允許的,因為編譯器會自動把列舉量轉換為int型別。

(6)第二條講:在不進行強制轉換的前提下,只能將定義的列舉量賦值給該種列舉的變數,言下之意就是可以通過強制轉換將其他型別值賦給列舉變數:

weekday = enumtype(2);等同於:weekday = wednesday;但是,如果試圖將乙個超出列舉取值範圍的值通過強制轉換賦給列舉變數,會出現什麼結果?

weekday = enumtype(20);結果將是不確定的,這麼做不會出錯,但得不到想要的結果。

(1)前面講通過定義enum enumtype ;

列舉量monday、tuesday等的值預設分別為0-6,我們可以顯式的設定列舉量的值:

enum enumtype ;

指定的值必須是整數

(2)也可以只顯式的定義一部分列舉量的值:

enum enumtype ;這樣monday、wednesday均被定義為1,則tuesday=2,thursday、friday、saturday、sunday的值預設分別為2、3、4、5.總結:未被初始化的列舉值的值預設將比其前面的列舉值大1。

(3)第二條還說明另外乙個現象,就是列舉量的值可以相同。

(4)列舉變數只是定義了乙個常量集合,裡面沒有元素,列舉型別作為int型別儲存,sizeof值都為4,系統為其初始化為0

前面講到可以通過強制轉換將其他型別值賦給列舉變數:weekday = enumtype(2);這是合法的;但是weekday = enumtype(20);是非法的。這裡涉及列舉取值範圍的概念:列舉的上限是 大於最大列舉量的 最小的2的冪,減去1;

列舉的下限有兩種情況:一、列舉量的最小值不小於0,則列舉下限取0;二、列舉量的最小值小於0,則列舉下限是 小於最小列舉量的 最大的2的冪,加上1。

舉例來講:

假如定義 enum enumtype1 ;

則列舉的上限是16-1=15(16大於最大列舉量14,且為2的冪);  

列舉的下限是-8+1=-7(-8小於最小列舉量-5,且為2的冪);

個人覺得列舉switch是最好的搭檔:enum enumtypestep=step0;//注意這裡在宣告列舉的時候直接定義了列舉變數step,並初始化為step0

switch (step)

case step1:

case step2:

default:break; }

另外列舉還有一種少見的用法是 enum ;  就是不指定乙個名字,這樣我們自然也沒法去定義一些列舉型別了。此時就相當於static const int one = 0;這樣定義三個常量一樣。然後用的話就是int no = one。

強型別列舉(strongly-typed enums),號稱列舉型別,是c++11中的新語法,用以解決傳統c++列舉型別存在的缺陷。傳統c++中列舉常量被暴漏在外層作用域中,這樣若是同一作用域下有兩個不同的列舉型別,但含有相同的列舉常量也是不可的,比如:

enum side;

enum thing;

這是不能一起用的。 

另外乙個缺陷是傳統列舉值總是被隱式轉換為整形,使用者無法自定義型別。c++11中的強型別列舉解決了這些問題。

強型別列舉使用enum class語法來宣告,如下:

enum class enumeration;
這樣,列舉型別時安全的,列舉值也不會被隱式轉換為整數,無法和整數數值比較,比如(enumeration::val4==10會觸發編譯錯誤)。

另外列舉型別所使用的型別預設為int型別,也可指定其他型別,比如:

enum calss enum:unsigned int;
正如前面所說,強型別列舉能解決傳統列舉不同列舉類下同列舉值名的問題,使用列舉型別的列舉名時,必須指明所屬範圍,比如:enum::val1,而單獨的val1則不再具有意義。

還有一點值得說明的是c++11中列舉型別的前置宣告也是可行的,比如:

enum calss enum;

enum class enum1:unsigned int;

enum class color;
enum class trafficlight;
強型別列舉值具有傳統列舉的功能——命名列舉值,同時又具有類的特點——具有類域的成員和無法進行預設的型別轉換。所以也稱之為列舉類——enmu class

列舉類的底層資料必須是有符號或無符號整型,比如char unsigned int unsigned long,預設為int。

enmu class clolor:char;  //前置宣告列舉類

void foo(color*p); //前置宣告的使用

//....................

enum class color:char; //前置宣告的定義

C 列舉 詳解

列舉是乙個值型別,包含一組命名的常量,列舉型別用 enum 關鍵字定義 public enum color 可以宣告列舉型別的變數,如變數 c1,用列舉型別的名稱作為字首,設定乙個命名常量,來賦予列舉中的乙個值 color c1 color.red console.writeline c1 控制台輸...

c語言列舉詳解

列舉一般用於定義乙個集合,如色彩,星期等等,他提供了更加貼近實際的對物件的描述,方便了程式設計工作.下面簡單介紹下c語言中的列舉型別和在linux系統中的作用。列舉是乙個被命名的整型常數的集合,列舉在日常生活中很常見。例如表示星期的sunday,monday,tuesday,wednesday,th...

C 列舉型別詳解

列舉型可以隱式的轉換為int型 int型不能隱式的轉換為列舉型,int型必須強制轉換為列舉型。一 列舉型別的定義 enum 型別名 型別名是變數名,指定列舉型別的名稱。列舉值表也叫列舉元素列表,列出定義的列舉型別的所有可用值,各個值之間用 分開。例 enum suit 二 列舉變數說明 列舉變數有多...