轉自:http://www.cnblogs.com/jcsu/articles/1299051.html
注:以下全部代碼的執行環境為vc++ 6.0
在程式中,可能需要為某些整數定義一個别名,我們可以利用預處理指令#define來完成這項工作,您的代碼可能是:


#define mon 1
#define tue 2
#define wed 3
#define thu 4
#define fri 5
#define sat 6
#define sun 7


在此,我們定義一種新的資料類型,希望它能完成同樣的工作。這種新的資料類型叫枚舉型。
1. 定義一種新的資料類型 - 枚舉型
以下代碼定義了這種新的資料類型 - 枚舉型
enum day
{
mon=1, tue, wed, thu, fri, sat, sun
};
(1) 枚舉型是一個集合,集合中的元素(枚舉成員)是一些命名的整型常量,元素之間用逗号,隔開。
(2) day是一個辨別符,可以看成這個集合的名字,是一個可選項,即是可有可無的項。
(3) 第一個枚舉成員的預設值為整型的0,後續枚舉成員的值在前一個成員上加1。
(4) 可以人為設定枚舉成員的值,進而自定義某個範圍内的整數。
(5) 枚舉型是預處理指令#define的替代。
(6) 類型定義以分号;結束。
2. 使用枚舉類型對變量進行聲明
新的資料類型定義完成後,它就可以使用了。我們已經見過最基本的資料類型,如:整型int, 單精度浮點型float, 雙精度浮點型double, 字元型char, 短整型short等等。用這些基本資料類型聲明變量通常是這樣:


char a; //變量a的類型均為字元型char
char letter;
int x,
y,
z; //變量x,y和z的類型均為整型int
int number;
double m, n;
double result; //變量result的類型為雙精度浮點型double


既然枚舉也是一種資料類型,那麼它和基本資料類型一樣也可以對變量進行聲明。
方法一:枚舉類型的定義和變量的聲明分開
enum day yesterday;
enum day today;
enum day tomorrow; //變量tomorrow的類型為枚舉型enum day
enum day good_day, bad_day; //變量good_day和bad_day的類型均為枚舉型enum day
方法二:類型定義與變量聲明同時進行:


enum //跟第一個定義不同的是,此處的标号day省略,這是允許的。
saturday,
sunday = 0,
monday,
tuesday,
wednesday,
thursday,
friday
} workday; //變量workday的類型為枚舉型enum day


enum week { mon=1, tue, wed, thu, fri sat, sun} days; //變量days的類型為枚舉型enum week
enum boolean { false, true } end_flag, match_flag; //定義枚舉類型并聲明了兩個枚舉型變量
方法三:用typedef關鍵字将枚舉類型定義成别名,并利用該别名進行變量聲明:


typedef enum workday
} workday; //此處的workday為枚舉型enum workday的别名


workday today, tomorrow; //變量today和tomorrow的類型為枚舉型workday,也即enum workday
enum workday中的workday可以省略:


typedef enum


也可以用這種方式:




注意:同一個程式中不能定義同名的枚舉類型,不同的枚舉類型中也不能存在同名的命名常量。錯誤示例如下所示:
錯誤聲明一:存在同名的枚舉類型


} workday;
typedef enum week


錯誤聲明二:存在同名的枚舉成員


} workday_1;
} workday_2;


3. 使用枚舉類型的變量
3.1 對枚舉型的變量指派。
執行個體将枚舉類型的指派與基本資料類型的指派進行了對比:
方法一:先聲明變量,再對變量指派


#include<stdio.h>
/* 定義枚舉類型 */
enum day { mon=1, tue, wed, thu, fri, sat, sun };
void main()
/* 使用基本資料類型聲明變量,然後對變量指派 */
int x, y, z;
x = 10;
y = 20;
z = 30;
/* 使用枚舉類型聲明變量,再對枚舉型變量指派 */
enum day yesterday, today, tomorrow;
yesterday = mon;
today = tue;
tomorrow = wed;
printf("%d %d %d \n", yesterday, today, tomorrow);
}


方法二:聲明變量的同時賦初值


#include <stdio.h>
/* 使用基本資料類型聲明變量同時對變量賦初值 */
int x=10, y=20, z=30;
/* 使用枚舉類型聲明變量同時對枚舉型變量賦初值 */
enum day yesterday = mon,
today = tue,
tomorrow = wed;


方法三:定義類型的同時聲明變量,然後對變量指派。


/* 定義枚舉類型,同時聲明該類型的三個變量,它們都為全局變量 */
enum day { mon=1, tue, wed, thu, fri, sat, sun } yesterday, today, tomorrow;
/* 定義三個具有基本資料類型的變量,它們都為全局變量 */
int x, y, z;
/* 對基本資料類型的變量指派 */
x = 10; y = 20; z = 30;
/* 對枚舉型的變量指派 */
printf("%d %d %d \n", x, y, z); //輸出:10 20 30
printf("%d %d %d \n", yesterday, today, tomorrow); //輸出:1 2 3


方法四:類型定義,變量聲明,賦初值同時進行。


/* 定義枚舉類型,同時聲明該類型的三個變量,并賦初值。它們都為全局變量 */
mon=1,
tue,
wed,
thu,
fri,
sat,
sun
yesterday = mon, today = tue, tomorrow = wed;
/* 定義三個具有基本資料類型的變量,并賦初值。它們都為全局變量 */
int x = 10, y = 20, z = 30;


3.2 對枚舉型的變量賦整數值時,需要進行類型轉換。


yesterday = tue;
today = (enum day) (yesterday + 1); //類型轉換
tomorrow = (enum day) 30; //類型轉換
//tomorrow = 3; //錯誤
printf("%d %d %d \n", yesterday, today, tomorrow); //輸出:2 3 30


3.3 使用枚舉型變量


enum
{
bell = '\a',
backspace = '\b',
htab = '\t',
return = '\r',
newline = '\n',
vtab = '\v',
space = ' '
enum boolean { false = 0, true } match_flag;
int index = 0;
int count_of_letter = 0;
int count_of_space = 0;
char str[] = "i'm ely efod";
match_flag = false;
for(; str[index] != '\0'; index++)
if( space != str[index] )
count_of_letter++;
else
{
match_flag = (enum boolean) 1;
count_of_space++;
}
printf("%s %d times %c", match_flag ? "match" : "not match", count_of_space, newline);
printf("count of letters: %d %c%c", count_of_letter, newline, return);


輸出:
match 2 times
count of letters: 10
press any key to continue
4. 枚舉類型與sizeof運算符


enum escapes
bell = '\a',
htab = '\t',
return = '\r',
newline = '\n',
vtab = '\v',
space = ' '
printf("%d bytes \n", sizeof(enum escapes)); //4 bytes
printf("%d bytes \n", sizeof(escapes)); //4 bytes
printf("%d bytes \n", sizeof(enum boolean)); //4 bytes
printf("%d bytes \n", sizeof(boolean)); //4 bytes
printf("%d bytes \n", sizeof(match_flag)); //4 bytes
printf("%d bytes \n", sizeof(space)); //4 bytes
printf("%d bytes \n", sizeof(newline)); //4 bytes
printf("%d bytes \n", sizeof(false)); //4 bytes
printf("%d bytes \n", sizeof(0)); //4 bytes


![]()
枚舉