標籤:
1、枚舉常量的定義
enum 枚舉類型名{常量1,常量2,常量3,.......};
例如定義一個星期的枚舉常量:enum Week {Mon,Tue,Wed,.....};
這就定義了一個新的資料類型:Week。
Week資料類型來源於int類型(預設)。
Week類型的資料只能有7種取值,它們是:SUNDAY,MONDAY,TUESDAY……SATURDAY。
其中SUNDAY = 0,MONDAY = 1……SATURDAY = 6。也就是說,第1個枚舉值代表0,第2個枚舉值代表1,這樣依次遞增1。
不過,也可以在定義時,直接指定某個或某些枚舉值的數值。比如,對於中國人,可能對於用0表示星期日不是很好接受,不如用7來表示星期天。這樣我們需要的個值就是 1,2,3,4,5,6,7。可以這樣定義:
enum Week {MONDAY = 1,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY,SATURDAY,SUNDAY};
我們希望星期一仍然從1開始,枚舉類型預設枚舉值從0開始,所以我們直接指定MONDAY等於1,這樣,TUESDAY就將等於2,直接到SUNDAY等於7。
枚舉值,我們就稱為枚舉常量,因為它一經定義以後,就不可再改變,以下用法是錯誤的!
TUESDAY = 10; //錯誤!我們不能改變一個枚舉值的數值。
用枚舉常量來完成表達今天是星期三:
Week today = TUESDAY;
2、枚舉常量和宏定義的區別與聯絡
宏和枚舉的主要區別是作用的時間和儲存形式不同。宏定義是在編譯預先處理階段作用的,也就是在編譯預先處理時,就會進行宏替換,將程式中的所有宏名替換為所定義的常量名,而枚舉則是在程式運行之後才起作用的。宏定義不分配記憶體空間,而枚舉常量儲存在資料的靜態儲存區中(這一點一定要注意)。宏只佔用程式碼片段的空間,而枚舉除了佔用程式碼片段空間外,還耗費CPU資源。
但是不能說宏就一定比枚舉好,因為你定義一大堆的宏總是非常的不方便的。
3、枚舉類型與sizeof運算子
下面是我在VS2008中的程式:
#include "stdafx.h"
#include "stdio.h"
enum WEEK{Mon,Tue,Wed,Thu,Fri,San,Sun};
enum Boolean{True,fal};
int main(int argc, _TCHAR* argv[])
{
char c;
WEEK today;
Boolean bol;
printf("size of today is %d\n",sizeof(today));
printf("size of WEEK is %d\n",sizeof(WEEK));
printf("size of Boolean is %d\n",sizeof(Boolean));
printf("size of bol is %d\n",sizeof(bol));
c=getchar();
return 0;
}
運行結果全是:4
這是為什麼呢?
這是因為枚舉量是當做整型量來處理的,所以結果全部為4
再看下面一段程式:
#include "stdafx.h"
#include "stdio.h"
enum WEEK{Mon,Tue,Wed,Thu,Fri,San,Sun};
enum Boolean{True,fal};
struct str1
{
enum WEEK{Mon,Tue,Wed,Thu,Fri,San,Sun};
enum Boolean{True,fal};
};
struct str2
{
enum WEEK{Mon,Tue,Wed,Thu,Fri,San,Sun} we;
enum Boolean{True,fal}bl;
};
struct str3
{};
int main(int argc, _TCHAR* argv[])
{
char c;
WEEK today;
Boolean bol;
str1 str1;
str2 str2;
str3 str3;
printf("size of today is %d\n",sizeof(today));
printf("size of WEEK is %d\n",sizeof(WEEK));
printf("size of Boolean is %d\n",sizeof(Boolean));
printf("size of bol is %d\n",sizeof(bol));
printf("size of str1 is %d\n",sizeof(str1));
printf("size of str2 is %d\n",sizeof(str2));
printf("size of str3 is %d\n",sizeof(str3));
printf("%d\n",&str1);
printf("%d\n",&str2);
printf("%d\n",&str3);
c=getchar();
return 0;
}
定義了三個結構體str1,str2和str3,在結構體一中沒有定義任何變數,只定義了枚舉常量,在結構體二中定義了變數,結構體三直接為一個空結構體,那麼運行結果如何呢?
為什麼結構體一和結構體三的sizeof都為1呢,這是因為在結構體1中實際上沒有定義任何變數,相當於一個空結構體,空結構體有大小為1,因為這個東西還是存在的,所以就返回1。
【轉】枚舉常量