1. 程式人生 > >C語言關鍵字淺析-enum

C語言關鍵字淺析-enum

### C語言關鍵字淺析系列 ###

### ISO/ANSI C 關鍵字 ###

enum關鍵字的原型是enumerated type,意思是列舉型別

這是ISO/ANSI C90標準新增的關鍵字之一(const、enum、signed、void、volatile)

 

enum的作用是:

宣告代表整數常量的符號名稱。

 

1、列舉是什麼意思

列舉有列舉的意思,本意是一個一個列舉出來,更準確一點應該是列出有窮序列集的所有成員

生活中的列舉例子很多,如一年的十二個月:January,February,……,November,December

一週7天:Monday,Tuesday,……,Sunday

簡化的七彩彩虹顏色:紅,橙,黃,綠,藍,靛,紫

 

2、列舉型別(enumeration type)

列舉型別的一個作用是提高程式的可讀性,從語法上看,如果你已經學過了C語言中的“結構(struct)”的概念

你會發現他們的語法格式是差不多的:

struct student{      /* 這是一個結構 */
	char[30] name;
	int age;
};

enum Taiji{          /* 這是一個列舉 */
	Ying,
	Yang
};

struct student stu;   /* 定義結構的變數 */
enum Taiji tj;        /* 定義列舉的變數 */

如何使用列舉型別的變數呢?

enum monthes{
	January,February,Match,April,May,June,July,August,September,October,November,December
};
enum monthes mon;

/* 某個函式 */
void fun()
{
	mon = February;    /* 可以在其取值範圍內賦值 */
	if (mon == August) /* 可以在邏輯表示式中直白地這樣寫 */
	{
		// Operation_1
	}

        for(mon = February;mon <= September;mon++)  /* 可以寫進迴圈條件判斷 */
	{
		// Operation_2
	}
        /*
            注:該式中的mon++表示式,這樣的格式在C中是支援的,但在C++中不允許,
            即C語言支援對列舉變數使用自增運算子,而C++不允許,如果程式存在兩種語
            言的交叉,可以將mon宣告為int型別,即可相容C/C++
        */
}

3、列舉型別的本質和enum常量

技術上看,上述的January等列舉值並不是以字元形式儲存,而是一個個int型別的整數常量,

如果我們把January按%d輸出,可以看到打印出一個0。

這樣的結構允許列舉常量用在switch結構中,因為它本質是int。

如果沒有額外規定,列舉列表的常量會按照預設的數序指定,即從第一個列舉項開始分別為0,1,2……

當然在定義時我們也可以自己做出一點規定:

enum monthes{        /* 如果我們希望列舉的月份和表示它的值是一致的 */
	January = 1,
	February = 2,
	Match = 3,
	April = 4,
	……
};

enum humi{    /* 溼度預設等級 */
	dry = 10, normal = 45, wet = 80
};

如果存在某些列舉項沒有自定義賦值呢?

enum humi{
	broken,                                  /* 首個列舉預設值為0 */
	veryDry = 9, Dry, littleDry,             /* 此時後兩項沒有指定,但系統會從9開始往後繼續指定,即10,11…… */
	belowNormal = 44, Normal, aboveNormal,   /* 同理,此處三項為44,45,46 */
	littleWet = 79, Wet, veryWet             /* 每個自定義的指定值可以看做列舉指定的“新起點”,                
                                                    如果沒有指定則自動按序指定 */
};

列舉配合case在switch結構中能很好地提高程式可讀性:

enum weekdays{
	Mon, Tues, Wed, Thur, Fri, Sat, Sun
};
……
void fun()
{
	enum weekdays week;
	……
	switch (week)
	{
		case Mon:	printf("It's Monday");
		case Tues:	printf("It's Tuesday");
		case Wed:	printf("It's Wednesday");
		case Thur:	printf("It's Thursday");
		case Fri:	printf("It's Friday");
		case Sat:	printf("It's Saturday");
		case Sun:	printf("It's Sunday");
		default:	printf("What a bug...");
	}
	……
}

 

——參考《C Primer Plus第五版》

 

相關文章:

C語言關鍵字淺析-struct