天天看點

c語言 枚舉類型 uint32_C語言學習篇(26)——枚舉enum引言概念和一些特性枚舉的作用枚舉的使用情景總結

引言

在日常編寫代碼或開源項目中,枚舉(enum)資料類型到處可見,那麼為什麼要引入枚舉這樣的資料類型呢?枚舉類型能帶來哪些程式設計時的便利呢?首先枚舉和宏定義有一定相似性,那麼兩者有什麼差別呢?什麼時候用枚舉,什麼時候用宏定義呢?今天我們就來聊聊枚舉資料類型。

概念和一些特性

枚舉(enum)在C語言中是一些符号常量集。通俗來說:枚舉定義了一些符号,這些符号的本質就是int類型的常量,每個符号和一個常量綁定。枚舉中的符号就表示一個自定義的一個識别碼,編譯器對枚舉的認知就是符号常量所綁定的那個int類型的數字。

#include //枚舉類型定義enum weekdays{Monday = 1,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday,};int main(void){//定義枚舉變量dayenum weekdays day = Monday;printf("day Value = %d.", day);return 0;}
           

簡單分析下,首先我們定義了一個weekdays枚舉類型,元素符号是從星期一(指派為1)到星期天,然後定義了枚舉變量day,并初始化為Monday,之後列印其值。

我們編譯運作下:

c語言 枚舉類型 uint32_C語言學習篇(26)——枚舉enum引言概念和一些特性枚舉的作用枚舉的使用情景總結

可以看到day指派為”Monday“,其值為1,與我們預想的一緻。 相信這裡有小夥伴就會提出如果在定義枚舉類型時,沒有初始化(即Monday=1),那麼day的值是多少呢?那麼我們來測試下,将以上的枚舉改為如下:

//枚舉類型定義enum weekdays{Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday,};
           

然後,再次編譯運作:

c語言 枚舉類型 uint32_C語言學習篇(26)——枚舉enum引言概念和一些特性枚舉的作用枚舉的使用情景總結

可以看到結果為0,是以這裡可以引出一個結論:枚舉類型在定義時,如果第一個元素符号沒有指定值,那麼預設其值為0。

OK,接下來我們定義多個枚舉類型,并依次指派為枚舉中的元素符号,并列印它們的值,具體如下:

#include //枚舉類型定義enum weekdays{Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday};int main(void){//定義枚舉變量dayenum 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.", day1);printf("day Value = %d.", day2);printf("day Value = %d.", day3);printf("day Value = %d.", day4);printf("day Value = %d.", day5);printf("day Value = %d.", day6);printf("day Value = %d.", day7);return 0;}
           

編譯運作:

c語言 枚舉類型 uint32_C語言學習篇(26)——枚舉enum引言概念和一些特性枚舉的作用枚舉的使用情景總結

從結果來看,我們可以得出另外一個結論:枚舉類型中的元素符号在沒有特别指定其值時,其值是自增長的(+1)。

接下來,我們再改造下枚舉定義,我們對其一些元素符号指定值,具體如下:

//枚舉類型定義enum weekdays{Monday,Tuesday,Wednesday,Thursday=4,//指定“Thursday”值為4Friday,Saturday=9,   SaturdaySunday};
           

編譯運作:

c語言 枚舉類型 uint32_C語言學習篇(26)——枚舉enum引言概念和一些特性枚舉的作用枚舉的使用情景總結

從結果中我們又可以總結出一個規律:我們可以指定枚舉中任一進制素符号的值,并且下一個符号的值是根據上的符号的值進行增長的。

枚舉的作用

枚舉本質是對一些數字,如0,1,2,3.... 進行符号編碼,這樣的好處就是程式設計時可以不用看數字而直接看符号,就能明白其實際含義,一目了然,否則我們很難或是很費勁看其他人寫的代碼(如代碼中正确傳回0,錯誤傳回-1,而 用枚舉TRUE, FLASE,就能非常清楚知道含義,使代碼清晰化,這也是非常重要的程式設計技巧和習慣)。

另一方面,之前我們講過的宏定義也是能将一些數字,轉為用符号表示,但是宏定義并沒有我們上述講的枚舉特性,每一個宏定義的符号或是表達式都是獨立的,而我們枚舉中的元素雖然是獨立了,但是每個元素符号的值是有關聯的(比如自增長)。

枚舉的使用情景

當我們要定義的常量是一個有限集合時,如一個星期,星期一到星期日,一個月31天,一年12個月....等等,當然使用宏定義也行,但是使用枚舉更适合。

而當一些常量符号之間無關聯,或者是無限的情況下,更适合用宏定義。

總結

在C語言中是可以沒有枚舉類型的,我們完全可以用宏定義或者直接使用數字表示, 但是這樣的程式設計習慣并不推薦,枚舉的幾點特性還是非常好用的,讓我們的代碼看起來非常工整,清晰:

  • 枚舉類型在定義時,如果第一個元素符号沒有指定值,那麼預設其值為0
  • 枚舉類型中的元素符号在沒有特别指定其值時,其值是自增長的(+1)
  • 我們可以指定枚舉中任一進制素符号的值,并且下一個符号的值是根據上的符号的值進行增長的
c語言 枚舉類型 uint32_C語言學習篇(26)——枚舉enum引言概念和一些特性枚舉的作用枚舉的使用情景總結