天天看點

枚舉

轉自: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

枚舉
枚舉
枚舉
下一篇: NodeJS API簡介

繼續閱讀