C語言學習篇(26)——枚舉enum

引言

在日常編寫代碼或開源項目中,枚舉(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,之後打印其值。

我們編譯運行下:

C語言學習篇(26)——枚舉enum

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

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

然後,再次編譯運行:

C語言學習篇(26)——枚舉enum

可以看到結果為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>

編譯運行:

C語言學習篇(26)——枚舉enum

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

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

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

編譯運行:

C語言學習篇(26)——枚舉enum

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

枚舉的作用

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

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

枚舉的使用情景

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

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

總結

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

  • 枚舉類型在定義時,如果第一個元素符號沒有指定值,那麼默認其值為0
  • 枚舉類型中的元素符號在沒有特別指定其值時,其值是自增長的(+1)
  • 我們可以指定枚舉中任一元素符號的值,並且下一個符號的值是根據上的符號的值進行增長的
C語言學習篇(26)——枚舉enum


分享到:


相關文章: