引言
在日常編寫代碼或開源項目中,枚舉(enum)數據類型到處可見,那麼為什麼要引入枚舉這樣的數據類型呢?枚舉類型能帶來哪些編程時的便利呢?首先枚舉和宏定義有一定相似性,那麼兩者有什麼區別呢?什麼時候用枚舉,什麼時候用宏定義呢?今天我們就來聊聊枚舉數據類型。
概念和一些特性
枚舉(enum)在C語言中是一些符號常量集。通俗來說:枚舉定義了一些符號,這些符號的本質就是int類型的常量,每個符號和一個常量綁定。枚舉中的符號就表示一個自定義的一個識別碼,編譯器對枚舉的認知就是符號常量所綁定的那個int類型的數字。
<code>#include //枚舉類型定義 enum weekdays { Monday = 1, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday, }; int main(void) { //定義枚舉變量day enum weekdays day = Monday; printf("day Value = %d.\n", day); return 0; }/<code>
簡單分析下,首先我們定義了一個weekdays枚舉類型,元素符號是從星期一(賦值為1)到星期天,然後定義了枚舉變量day,並初始化為Monday,之後打印其值。
我們編譯運行下:
可以看到day賦值為”Monday“,其值為1,與我們預想的一致。 相信這裡有小夥伴就會提出如果在定義枚舉類型時,沒有初始化(即Monday=1),那麼day的值是多少呢?那麼我們來測試下,將以上的枚舉改為如下:
<code>//枚舉類型定義 enum weekdays { Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday, };/<code>
然後,再次編譯運行:
可以看到結果為0,因此這裡可以引出一個結論:枚舉類型在定義時,如果第一個元素符號沒有指定值,那麼默認其值為0。
OK,接下來我們定義多個枚舉類型,並依次賦值為枚舉中的元素符號,並打印它們的值,具體如下:
<code>#include //枚舉類型定義 enum weekdays { Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday }; int main(void) { //定義枚舉變量day enum weekdays day1 = Monday; enum weekdays day2 = Tuesday; enum weekdays day3 = Wednesday; enum weekdays day4 = Thursday; enum weekdays day5 = Friday; enum weekdays day6 = Saturday; enum weekdays day7 = Sunday; printf("day Value = %d.\n", day1); printf("day Value = %d.\n", day2); printf("day Value = %d.\n", day3); printf("day Value = %d.\n", day4); printf("day Value = %d.\n", day5); printf("day Value = %d.\n", day6); printf("day Value = %d.\n", day7); return 0; }/<code>
編譯運行:
從結果來看,我們可以得出另外一個結論:枚舉類型中的元素符號在沒有特別指定其值時,其值是自增長的(+1)。
接下來,我們再改造下枚舉定義,我們對其一些元素符號指定值,具體如下:
<code>//枚舉類型定義 enum weekdays { Monday, Tuesday, Wednesday, Thursday=4, //指定“Thursday”值為4 Friday, Saturday=9, // //Saturday Sunday };/<code>
編譯運行:
從結果中我們又可以總結出一個規律:我們可以指定枚舉中任一元素符號的值,並且下一個符號的值是根據上的符號的值進行增長的。
枚舉的作用
枚舉本質是對一些數字,如0,1,2,3.... 進行符號編碼,這樣的好處就是編程時可以不用看數字而直接看符號,就能明白其實際含義,一目瞭然,否則我們很難或是很費勁看其他人寫的代碼(如代碼中正確返回0,錯誤返回-1,而 用枚舉TRUE, FLASE,就能非常清楚知道含義,使代碼清晰化,這也是非常重要的編程技巧和習慣)。
另一方面,之前我們講過的宏定義也是能將一些數字,轉為用符號表示,但是宏定義並沒有我們上述講的枚舉特性,每一個宏定義的符號或是表達式都是獨立的,而我們枚舉中的元素雖然是獨立了,但是每個元素符號的值是有關聯的(比如自增長)。
枚舉的使用情景
當我們要定義的常量是一個有限集合時,如一個星期,星期一到星期日,一個月31天,一年12個月....等等,當然使用宏定義也行,但是使用枚舉更適合。
而當一些常量符號之間無關聯,或者是無限的情況下,更適合用宏定義。
總結
在C語言中是可以沒有枚舉類型的,我們完全可以用宏定義或者直接使用數字表示, 但是這樣的編程習慣並不推薦,枚舉的幾點特性還是非常好用的,讓我們的代碼看起來非常工整,清晰:
- 枚舉類型在定義時,如果第一個元素符號沒有指定值,那麼默認其值為0
- 枚舉類型中的元素符號在沒有特別指定其值時,其值是自增長的(+1)
- 我們可以指定枚舉中任一元素符號的值,並且下一個符號的值是根據上的符號的值進行增長的