列舉型別enum例題 c語言之列舉型別(enum)

2021-10-14 18:29:38 字數 3267 閱讀 2059

1 . 如果乙個變數只有幾種可能的值,則可以定義為「列舉型別」;所謂「列舉」就是把可能的值一一的列舉出來,變數的值只限於列舉出來的值的範圍, 如:

語法:  enum 列舉型別;  //其中的列舉成員列表是以逗號「,」相分隔  如:    enum spectrum;
enum spectrum;
enum spectrum; 其中:enum為關鍵字, spectrum為該列舉型別的標記名(標記名:遵循識別符號的命名規則); 花括號「{}」中的red,black,yellow,blue,white稱為「列舉元素」或「列舉常量」;
2.可以用「列舉型別」宣告符號名稱來表示int型常量。只要是能使用int型的地方就能夠使用列舉型別。注意:c語言中的列舉的一些特性不適合c++;比如c中的列舉變數允許使用++運算子,但是c++中則不允許。

3.有關列舉型別常量的預設值這裡仍然拿上面的列舉型別常量作為示例:

enum spectrum;                   0    1     2     3     4 預設情況下:該列舉列表中的常量值分別為:0,1,2,3,4
當然也可以在列舉宣告中,可以為列舉常量指定整數值:如
enum spectrum;
也可以只對列舉型別中的乙個列舉元素賦值;這時該列舉元素後面的列舉元素會被賦予後續的值。如:
enum spectrum;  則:red=0, black=22, yellow=23, blue=24, white=25;
此外,還可在列舉型別成員列表中,宣告多個成員的數值(整型常量值)相同, 如:

enum spectrum;則: red = 0, black = 22, yellow = 23, blue = 22 white = 23.
2018-04-26 07:04:01 補充

4.列舉型別也可以是匿名的

匿名的列舉型別會有著意想不到的作用,比如在程式中需要使用數值的名字的時候,常常有3種方法可以實現。

(1)巨集定義

#define false 0#define true  1
但是巨集定義有弱點:其定義的只是預處理階段的名字,在編譯器的預處理階段會進行簡單的名字替換,而且不會進行型別的安全檢查,其作用域是全域性的

( c++11強列舉型別 ) 

,因此若程式中有變數true、false,則會被替換。為了避免這樣的情況,採用將全部的巨集用大寫來命名,以區別於正常的**。

(2)匿名的enum列舉

enum ;    //false 0, true 1
這裡的false,true都是編譯時期的名字,編譯器會對其進行型別檢查,若**中其他地方有和該名字衝突的,會報錯。因此採用匿名的列舉不會有產生干擾正常**的尷尬。
static const int false = 0;static const int true = 1;
在這裡的true,false同樣會得到編譯器在編譯階段的檢查。由於是靜態變數,因此其作用域被限制到了本檔案內。相比於enum列舉型別,靜態變數不僅是編譯時期的名字,同時編譯器還可能會在**中為true,false產生實際的資料,這會增加一點儲存空間。

5.列舉型別的作用:提高程式的可讀性和可維護性

示例**一:輸出12個月的英文單詞

#include#include enum months;int main(void);  for (m=jan;m<=dec;m++)    }  system ("pause");  return 0;  }
示例**二:用作函式返回錯誤碼

這是在程式設計中使用得最為廣泛的用法之一,通常在開發中,我們把考慮到的所有可能出現的錯誤都列舉在乙個enum中,這樣,我們就不用再函式呼叫出錯時候,返回乙個數字。這樣的做法好處有很多:如更容易看出函式呼叫出錯的原因、如果enum中有漏掉的錯誤提示,則再新增乙個等。

typedef enum  rd_kafka_resp_err_t;
上面的**是 kafka c客戶端中的原始碼,即列舉出kafka 客戶端中可能會出現的錯誤的原因。通常,還會實現2個函式,如:
//1.返回便於人們閱讀的錯誤字串const char *rd_kafka_err2str (rd_kafka_resp_err_t err); //該函式的實現很簡單,即以字串形式列印error,如:const char *rd_kafka_err2str (rd_kafka_resp_err_t err)}//2.若errnox錯誤碼在我們列舉出的enum中,則返回enum中的錯誤碼列印rd_kafka_resp_err_t rd_kafka_errno2err (int errnox);
一般在函式呼叫失敗的地方的日誌列印中,加入上面2個函式:先rd_kafka_errno2err,再rd_kafka_err2str

如:

#include #include #include using namespace std;enum;/**@fn            div * @brief         除法函式 * @param[in]     const int a 被除數 * @param[in]     const int b 除數 * @param[out]    int &outdata 結果值 * @return        int**/int div(const int a,const int b, int &outdata)    outdata = a/b;    return operator_ok;}/**@fn            err2str * @brief         將錯誤碼轉換為對應字串 * @param[out]    const int ierrno 待轉換的錯誤碼 * @return        轉換後的錯誤碼字串**/const char* err2str(const int ierrno)    switch (ierrno) }int main()    std::cout<    return 0;}
列印結果

C語言之enum列舉型別變數

enum變數用在將變數轉為數字的時候,比如true和false 正常的情況下我們是定義為 define true 1 define false 0使用列舉變數可以這麼定義 enum boola a是列舉變數,其值只能是0或者1 if a 1 else 在資料多的情況下,比如是狀態機的狀態,資料型別的...

c列舉型別enum例題 c語言列舉型別的一些例子

c 語言列舉型別的一些例子 注以下全部 的執行環境為 vc 6.0 巨集和列舉的區別 巨集和列舉之間的差別主要在作用的時期和儲存的形式不同,巨集是在預 處理的階段進行替換工作的,它替換 段的文字,程式執行的過程中巨集已不 存在了。而列舉是在程式執行之 b5e2rgbcap 而列舉除后才起作用的,列舉...

列舉型別enum例題 10 1 C 列舉型別

c 列舉型別 在c 中,如果乙個變數只有幾種可能的值,可以定義為列舉型別。列舉是指將變數的值一一枚舉出來,變數的值只能在列舉出來的值的範圍內。c 宣告列舉型別用enum開頭。enum weekday enum 上面宣告了乙個列舉型別weekday,花括號中sunday,monday,tuesday,...