列舉型別(enumerated type)是由命名值(named value)的集合所構成的一種資料型別(data type),
在ANSI C中,列舉是一個常量整型值的串列,通常被用于給整形常量分配特定的名字,從而使程式更加可讀且易于維護(除錯),并且提供額外的型別檢查的機會,同時也是對于#define所定義的宏常量的一種替代,
目錄:
- 可讀性優越性
- 列舉型別變數與列舉變數的宣告與使用
- 型別檢查與除錯優越性
可讀性優越性
為了清晰地展示這種替代在可讀性上的優越性,以下是一個例子(月份的符號標識與對應整形常量):
使用#define的陳述句定義宏常量,有:
#define JAN 1
#define FEB 2
#define MAR 3
#define APR 4
...
#define DEC 12
printf("%d", JAN) /* 使用JAN的值 */
而若是使用列舉常量,則有:
enum Months {JAN = 1, FEB, MAR, APR, ... , DEC};
/* 定義名為 Months 的列舉型別 */
enum Months month = JAN;
/* 宣告 Months列舉型別 的列舉變數 month 并賦值 JAN */
printf("%d", month); /* 使用JAN的值 */
值得注意的是,在沒有顯式說明的情況下,enum型別中的第一個列舉成員的值為0,第二個為1,以此類推,
如果只指定了部分列舉名的值(JAN = 1),那么未指定值的列舉成員的值將依照最后一個指定值向后遞增(FEB = 2...),
列舉型別變數與列舉變數的宣告與使用
如您所見,列舉型別變數(variables of enum types)通過如下的陳述句宣告:
enum <列舉型別變數名> {<列舉常量 1> ...}; /* <列舉常量> 由 <列舉常量識別符號(名)>=<整形值> 構成 */
列舉變數(enumeration variables)通過如下的陳述句宣告:
enum <列舉型別變數名> <列舉變數名>;
通過如下陳述句操作:
<列舉變數名> = <列舉常量識別符號>;
通常地,列舉變數將被編譯器作為一個整形變數對待,這意味著你可以像使用整形變數一樣使用列舉變數,并可以使用自增減運算子來迭代列舉變數,
值得注意的是,與int <variable>不同,對于列舉變數只應當分配該列舉的有效值(在宣告列舉的陳述句中中有對應的列舉成員),
型別檢查與除錯優越性
比起使用#define去創建一系列的宏常量或使用普通的int <variable>,使用列舉常量將使你獲得一些特殊的益處,正如在K&R C(C程式設計語言)的2.3節中,提到了:
列舉為建立常量值與名字之間的關聯提供了一種便利的方式,相對于
#define陳述句來說,它的優勢在于常量值可以自動生成,盡管可以宣告enum型別的變數,但編譯器并不會檢查這種型別的變數中存盤的值是否為該列舉的有效值,不過,列舉變數提供這種檢查的機會(offer the chance of checking),因此列舉比#define更具優勢,此外,除錯程式可以以符號形式列印出列舉變數的值,
這意味著:
- 一些Debugger會將
enum視為列舉型別并顯示列舉常量的名(符號形式)而不是字面值,(顯示JAN,而不是1) - 更重要的是,這可以是型別檢查的一種拓展,雖然并沒有被C語言標準所要求,但一些編譯器將檢查并確保被分配給列舉型別變數的值與其中的列舉常量相對應,(例如
mouth = 13將不能被確保)
本文作者: yakuback
著作權宣告: 本文使用 署名-非商業性使用-相同方式共享 許可協議. 如需轉載,請您注明出處.
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/45020.html
標籤:C
下一篇:淺談C語言指標
