【轉】枚舉常量

來源:互聯網
上載者:User

標籤:

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。

【轉】枚舉常量

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.