C語言學習之枚舉類型
阿新 • • 發佈:2019-02-20
article 進行 開始 說明 ucc 分享圖片 sun 系列文章 lstat
前言
枚舉(enum)類型是計算機編程語言中的一種數據類型。枚舉類型:在實際問題中,有些變量的取值被限定在一個有限的範圍內。例如,一個星期內只有七天,一年只有十二個月,一個班每周有六門課程等等。如果把這些量說明為整型,字符型或其它類型顯然是不妥當的。為此,C語言提供了一種稱為“枚舉”的類型。在“枚舉”類型的定義中列舉出所有可能的取值,被說明為該“枚舉”類型的變量取值不能超過定義的範圍。應該說明的是,枚舉類型是一種基本數據類型,而不是一種構造類型,因為它不能再分解為任何基本類型。
枚舉類型的定義
枚舉類型定義的一般形式為:
enum 枚舉名
{
枚舉值表
};
在枚舉值表中應羅列出所有可用值。這些值也稱為枚舉元素。
例如:
enum weekday
{
Mon, Tues, Wed, Thurs, Fri, Sat, Sun
};
該枚舉名為weekday,枚舉值共有7個,即一周中的七天。凡被說明為weekday類型變量的取值只能是七天中的某一天。
像上面那樣,當不寫對應的值,枚舉值默認從0開始,即等同於:
enum weekday
{
Mon = 0,
Tues = 1,
Wed = 2,
Thurs = 3,
Fri = 4,
Sat = 5,
Sun = 6
};
當然,也可以像這樣簡寫:
enum weekday { Mon = 0, Tues, Wed, Thurs, Fri, Sat, Sun };
這樣枚舉值就會從0開始遞增,和上面的寫法是一樣的。
枚舉變量的說明
如同結構體(struct)和共用體(union)一樣,枚舉變量也可用不同的方式說明,即先定義後說明,同時定義說明或直接說明。設有變量a,b,c被說明為上述的weekday,可采用下述任一種方式:
enum weekday{sun,mon,tue,wed,thu,fri,sat}; //定義枚舉類型 enum weekday a,b,c; //定義3個枚舉類型的變量 enum weekday{sun,mon,tue,wed,thu,fri,sat}a,b,c; //定義枚舉類型的同時,定義3個變量 enum{sun,mon,tue,wed,thu,fri,sat}a,b,c; //枚舉名可省略,但後面不能再定義新的枚舉變量
用typedef把枚舉類型定義一個別名
typedef enum weekday //此處的weekday為枚舉名
{
Mon = 0,
Tues,
Wed,
Thurs,
Fri,
Sat,
Sun
}weekday; //此處的weekday為enum weekday的別名
weekday today, tomorrow; //枚舉類型的變量,即enum weekday類型
當然枚舉名也可以省略:
typedef enum //省略枚舉名
{
Mon = 0,
Tues,
Wed,
Thurs,
Fri,
Sat,
Sun
}weekday; //此處的weekday為枚舉類型的別名
weekday today, tomorrow; //枚舉類型的變量,即enum weekday類型
但是不可以省略類型別名:
typedef enum weekday
{
Mon = 0,
Tues,
Wed,
Thurs,
Fri,
Sat,
Sun
};
weekday today, tomorrow; //Code::Blocks環境報錯
內存的分配
enum是枚舉型,所占內存空間恒等於4字;union是共用體,成員共用一個變量緩沖區。
註意
1.不能定義同名的枚舉的類型,如:
typedef enum
{
wednesday,
thursday,
friday
} workday; //定義了一個枚舉類型,別名為workday
typedef enum WEEK
{
saturday,
sunday = 0,
monday,
} workday; //定義了一個枚舉類型,別名為workday,重復了
2.不能包含同名的枚舉成員
typedef enum
{
wednesday, //成員重復
thursday,
friday
} workday_1;
typedef enum WEEK
{
wednesday,
sunday = 0,
monday,
} workday_2;
3.對枚舉型的變量賦整數值時,需要進行類型轉換。
在Code::Blocks環境測試並不需要進行強制轉換,無警告,無錯誤
單片機開發過程中常用的幾個枚舉類型
typedef enum {RESET = 0, SET = !RESET} FlagStatus, ITStatus;
typedef enum {DISABLE = 0, ENABLE = !DISABLE} FunctionalState;
typedef enum {ERROR = 0, SUCCESS = !ERROR} ErrorStatus;
#define IS_FUNCTIONAL_STATE(STATE) (((STATE) == DISABLE) || ((STATE) == ENABLE))
參考資料:
- C語言詳解-枚舉類型
Jlink使用技巧系列文章:
- Jlink使用技巧之合並燒寫文件
- Jlink使用技巧之燒寫SPI Flash存儲
- Jlink使用技巧之虛擬串口功能
- Jlink使用技巧之讀取STM32內部的程序
- Jlink使用技巧之J-Scope虛擬示波器功能
- Jlink使用技巧之單獨下載HEX文件到單片機
歡迎大家關註我的個人博客
或微信掃碼關註我的公眾號
C語言學習之枚舉類型