列舉是由一組具名整數常數所組成。 列舉型別宣告會提供 (選擇性) 列舉標記的名稱。 而且,它會定義具名整數標識碼集(稱為列舉集、列舉值常數、列舉值或成員)。 列舉類型的變數會儲存該類型所定義之列舉集的其中一個值。
類型的 enum 變數可用於索引表達式,以及做為所有算術和關係運算子的作數。 列舉提供預處理器指示詞的替代 #define 方法,其優點是可為您產生值,並遵守一般範圍規則。
在 ANSI C 中,定義列舉值常數值的表達式一律具有 int 類型。 這表示與列舉變數相關聯的記憶體是單 int 一值所需的記憶體。 列舉常數或列舉型別的值可以在 C 語言允許整數表達式的任何位置使用。
語法
enum-specifier:
enum
identifier
選擇{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 會與 值相關聯 ( constant-expression + 1),除非您明確將它與另一個值產生關聯。 的名稱 enumeration-constant 相當於其值。
您可以使用 enumeration-constant = constant-expression 來覆寫預設值序列。 也就是說,如果 enumeration-constant = constant-expression 出現在 中 enumerator-list,則會 enumeration-constant 與 所提供的 constant-expression值相關聯。 必須 constant-expression 有 int 型別,而且可以是負數。
下列規則適用於列舉集的成員:
列舉集可以包含重複的常數值。 例如,您可以將值 0 與兩個不同的標識符產生關聯,例如,在相同集合中名為
null和zero的成員。列舉清單中的標識碼必須與相同可見度相同範圍中的其他標識碼不同。 這包括其他列舉清單中的一般變數名稱和標識碼。
列舉標記遵守一般範圍規則。 它們必須與其他具有相同可見性的列舉、結構和等位標記不同。
範例
這些範例說明列舉宣告:
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;
或 as
enum BOOLEAN { false, true } end_flag;
enum BOOLEAN match_flag;
使用這些變數的範例可能如下所示:
if ( match_flag == false )
{
.
. /* statement */
.
}
end_flag = true;
您也可以宣告未命名的列舉值資料類型。 省略數據類型的名稱,但可以宣告變數。 變數 response 是定義的型別變數:
enum { yes, no } response;