C 列舉宣告

列舉是由一組具名整數常數所組成。 列舉型別宣告會提供 (選擇性) 列舉標記的名稱。 而且,它會定義一組具名整數識別碼, (稱為 列舉集列舉值常數列舉值或 成員) 。 列舉型別的變數會儲存該類型所定義之列舉集的其中一個值。

enum 類型的變數可以在索引運算式中使用,以及做為所有算術和關係運算子的運算元使用。 列舉提供了 #define 前置處理器指示詞的替代方式,具有自動產生值並遵循一般範圍規則的優點。

在 ANSI C 中,定義列舉值常數的運算式一律具有 int 型別。 這表示與列舉變數相關聯的儲存體是單 int 一值所需的儲存體。 列舉常數或列舉類型的值可以在 C 語言允許使用整數運算式的任何位置使用。

語法

enum-specifier:
enumidentifier選擇{enumerator-list}
enum identifier

enumerator-list:
enumerator
enumerator-list , enumerator

enumerator:
enumeration-constant
enumeration-constant = constant-expression

enumeration-constant:
identifier

選擇性 identifier 名稱所 enumerator-list 定義的列舉型別。 這個識別項通常稱為清單所指定列舉的「標記」。 類型規範宣告 identifier 為非決定性所 enumerator-list 指定的列舉標記,如下所示:

enum identifier
{
    // enumerator-list
}

enumerator-list 定義列舉集的成員。

如果標記的宣告可見,則稍後使用 標記但省略 enumerator-list 的宣告會指定先前宣告的列舉型別。 標記必須參考已定義的列舉類型,而且該列舉類型必須在目前範圍內。 由於列舉型別是在其他地方定義, enumerator-list 所以 不會出現在此宣告中。 衍生自列舉的類型宣告和列舉類型的 typedef 宣告,可以在列舉類型定義之前使用列舉標記。

enumeration-constant 一個 enumerator-list 都會命名列舉集的值。 根據預設,第一個 enumeration-constant 會與值 0 相關聯。 清單中的下一個 enumeration-constant 值與 ( + 1 ) 的值 constant-expression 相關聯,除非您明確地將它與另一個值產生關聯。 的名稱 enumeration-constant 相當於其值。

您可以使用 enumeration-constant = constant-expression 來覆寫值的預設序列。 也就是說,如果 enumeration-constant = constant-expression 出現在 中 enumerator-list ,則會 enumeration-constant 與 所提供的 constant-expression 值相關聯。 constant-expression必須具有 int 型別,而且可以是負數。

下列規則適用於列舉集合的成員:

  • 列舉集合可以包含重複的常數值。 例如,您可以將值 0 與兩個不同的識別碼產生關聯,例如,在相同集合中名為 nullzero 的成員。

  • 列舉清單中的識別碼必須與相同範圍內具有相同可見度的其他識別碼不同。 這包括其他列舉清單中的一般變數名稱和識別碼。

  • 列舉標記會遵循一般範圍規則。 它們必須與具有相同可視性的其他列舉、結構和等位標記有所區別。

範例

下面這些範例將說明列舉宣告:

enum DAY            /* Defines an enumeration type    */
{
    saturday,       /* Names day and declares a       */
    sunday = 0,     /* variable named workday with    */
    monday,         /* that type                      */
    tuesday,
    wednesday,      /* wednesday is associated with 3 */
    thursday,
    friday
} workday;

根據預設,值 0 會與 saturday 相關聯。 識別項 sunday 明確設定為 0。 其餘識別項的預設值為 1 至 5。

在這個範例中,DAY 集合中的值會指派給 today 變數。

enum DAY today = wednesday;

列舉常數的名稱是用來指派值。 由於先前已宣告 DAY 列舉類型,因此只有列舉標記 DAY 是必要的。

若要將整數值明確指派給列舉資料類型的變數,請使用類型轉換:

workday = ( enum DAY ) ( day_value - 1 );

建議在 C 中使用此轉換,但並非必要。

enum BOOLEAN  /* Declares an enumeration data type called BOOLEAN */
{
    false,     /* false = 0, true = 1 */
    true
};

enum BOOLEAN end_flag, match_flag; /* Two variables of type BOOLEAN */

這個宣告也可以指定為

enum BOOLEAN { false, true } end_flag, match_flag;

或為

enum BOOLEAN { false, true } end_flag;
enum BOOLEAN match_flag;

使用這些變數的範例如下所示:

if ( match_flag == false )
    {
     .
     .   /* statement */
     .
    }
    end_flag = true;

您也可以宣告未命名的列舉資料類型。 資料類型的名稱會加以省略,但是可以宣告變數。 變數 response 是所定義類型的變數:

enum { yes, no } response;

另請參閱

列舉