1. 程式人生 > >C語言學習之枚舉類型

C語言學習之枚舉類型

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語言學習之枚舉類型