天天看點

C / C++系列 (2):枚舉enum定義枚舉定義枚舉變量枚舉 vs. 共用體 & 結構體

enum

  • 定義枚舉
  • 定義枚舉變量
    • enum
    • int vs. enum
  • 枚舉 vs. 共用體 & 結構體

定義枚舉

由于在實際的程式設計中使用宏定義會使代碼的閱讀性變高,是以應該多采用宏定義進行賦。

但是在實際的應用中 有着這樣的問題:如果對于周一到周日需要定義1-7,一共7個define語句:

#define MON  1
#define TUE  2
#define WED  3
#define THU  4
#define FRI  5
#define SAT  6
#define SUN  7
           

一看就不太美觀,是以枚舉就出來了枚舉的定義如下:

是以将上述的宏定義可以改寫為:

enum DAY{
    MON, TUE, WED, THU, FRI, SAT, SUN
};
           

可以看到在enum内隻寫了名字,并沒有寫數值,這是因為在枚舉内如果沒有寫數值他的預設數值是0開始。是以周一到周日是從0 ~ 6。

若要把其改寫為1 ~ 7,隻需要做以下改動:

enum DAY{
    MON = 1, TUE, WED, THU, FRI, SAT, SUN
};
           

從中隻改變了MON的值,MON ~ SUN的值變成了1 ~ 7。

再舉個栗子:

enum Day{
    MON, TUE, WED, THU = 5, FRI, SAT, SUN
};
           

照規律,MON ~ WED為0 ~ 2,THU ~ SUN 為 5 ~ 8。

這些宏定義在定義時刻就生效了,并且在之後的程式中不可被更改(道理相當于宏定義)

定義枚舉變量

enum

和共用體和結構的使用方式類似。有以下三種方式:

1、先定義枚舉類型,再定義枚舉變量

enum DAY{
    MON=1, TUE, WED, THU, FRI, SAT, SUN
};
enum DAY day;
           

2、定義枚舉類型的同時定義枚舉變量

enum DAY{
    MON=1, TUE, WED, THU, FRI, SAT, SUN
} day;
           

3、省略枚舉名稱,直接定義枚舉變量

enum{
    MON=1, TUE, WED, THU, FRI, SAT, SUN
} day;
           

在使用的過程中應該注意的是以下幾點:

  1. 在C語言中枚舉變量被當做int類型或者unsigned int類型進行處理
  2. 在指派的時候可以指派一個整數也可以指派該枚舉變量對應的枚舉類型成員,但是其他枚舉類型成員不能被使用
  3. 進行部分資料操作的時候不能使用不同類型的枚舉變量進行操作。比如:“ == “(” + “這一類可以)

int vs. enum

在C 語言中,枚舉類型是被當做 int 或者 unsigned int 類型來處理的。但是為什麼要用枚舉變量呢。這是由于在開發的時候經常用int類型來定義一個整形變量。類比于枚舉這算一種int枚舉模式,這裡使用以下例子進行分析:

int Day_MON = 1;
...
int Day_SUN = 1;

int Mon_Jan = 1;
...
int Mon_Dec = 12;
           

int 的缺點:

  1. 在不同的枚舉類型(Day & Mon)之間互相傳遞資訊,編譯器不會警告,執行也不會出現錯誤;
  2. 用==操作符将Day與Mon比較,編譯器不會警告,執行也不會出現錯誤;
  3. int枚舉是編譯時常量,在之後的操作中可被更改。
  4. 将int枚舉常量翻譯成可列印的字元串很麻煩
  5. 如果想要周遊一個組中的所有int 枚舉常量,很困難。

是以采用枚舉就能規避這個缺點。枚舉類型還允許添加任意的方法和域,并且還有兩點好處:

enum Day{     
    MON, TUE, WED, THU, FRI, SAT, SUN
};
enum Mon {
   Jan, Feb, Mar, Apr, May, June, July, Aug, Sept, Oct, Nov, Dec
};
enum Mon mon;
// mon = FRI;     // error
// 
           

enum的優點:

  1. 能夠将資料與它的常量關聯起來
  2. 可使用适當的方法來增強枚舉類型,枚舉類型可以先作為枚舉常量的一個簡單集合,随着時間的推移在演變成為全功能的抽象。
  3. 克服以上int的缺點

枚舉 vs. 共用體 & 結構體

結構體是一種構造類型,它的每一個成員都可以是一個基本的資料類型或者又是一個構造類型(結構體的嵌套使用),它的所有成員都能共存,這也是它和共用體和枚舉類型的最大差別。它的簡單定義如下:

struct Num{    
   char i;
   int j;
   struct add;
}
           

共用體每一個定義的變量,它們的變量值是可以改變的,但它們的資料類型是不能改變的,共用體就是一種可以在同一存儲區域變成不同資料類型的一種資料類型。它采用的是覆寫存儲技術,準許不同的資料類型互相覆寫。它的簡單定義如下:

union Num{    
    char i;
    int  j;    
    struct add;
}
           

枚舉類型僅僅适用取值于有限的資料,它裡面的辨別符是常量不是變量,不能改變他的值,枚舉元素隻能是辨別符,不能是基本類型常量(宏定義),枚舉變量被當做int類型來對待,它的簡單定義如下:

enum{
    sun,
    mon,
    ...
}
           

繼續閱讀