天天看點

C 語言程式設計 — 進階資料類型 — 枚舉

目錄

文章目錄

  • 前文清單
  • 聲明枚舉類型
  • 定義枚舉類型的變量
  • 枚舉類型變量的枚舉值
  • 枚舉在 switch 語句中的使用
  • 将整型轉換為枚舉類型

《程式編譯流程與 GCC 編譯器》

《C 語言程式設計 — 基本文法》

《C 語言程式設計 — 基本資料類型》

《C 語言程式設計 — 變量與常量》

《C 語言程式設計 — 運算符》

《C 語言程式設計 — 邏輯控制語句》

《C 語言程式設計 — 函數》

《C 語言程式設計 — 進階資料類型 — 指針》

《C 語言程式設計 — 進階資料類型 — 數組》

《C 語言程式設計 — 進階資料類型 — 字元串》

枚舉類型的本質是一個整型常量的集合,列舉出可被通路的值的範圍,所謂 “枚舉” 就是把可能出現的值一一列舉出來。需要先聲明一個枚舉類型,告訴編譯器它具有哪些元素,然後才能夠被定義一個枚舉類型的變量。

  • 枚舉類型定義中的每個枚舉元素代表一個整型數值。若自定義枚舉類型的同時無指派行為,則由編譯系統會按照定義的順序為其配置設定 0, 1, 2, … 的資料值;反之,則以賦予的數值為準。
  • 枚舉元素必須為常量,在枚舉定義之外,均不能對枚舉元素進行指派操作。
  • 各枚舉元素不能重名,枚舉元素名也不能為程式中其他關鍵字或變量名。
// enum 關鍵字用于定義枚舉類型
enum 枚舉類型名
{
    枚舉元素1[=整型常量1],
    枚舉元素2[=整型常量2],
    ...
    枚舉元素n[=整型常量n]
};
           

e.g.

enum DAY
{
      MON=1, TUE, WED, THU, FRI, SAT, SUN
};
           

預設情況下,第一個枚舉成員的預設值為整型的 0,後續枚舉成員的值在前一個成員上加 1,以此類推。如上例,如果我們在這個執行個體中把第一個枚舉成員的值定義為 1,第二個就為 2,以此類推。

  • 先定義枚舉類型,再定義枚舉變量
// 聲明枚舉類型
enum DAY{
    MON=1, TUE, WED, THU, FRI, SAT, SUN
};

// 定義枚舉類型變量
enum DAY day;
           
  • 定義枚舉類型的同時定義枚舉變量
enum DAY{
    MON=1, TUE, WED, THU, FRI, SAT, SUN
} day;
           
  • 省略枚舉名稱,直接定義枚舉類型的同時定義枚舉變量
enum{
    MON=1, TUE, WED, THU, FRI, SAT, SUN
} day;
           

示例:

#include <stdio.h>

/* 聲明了一個枚舉類型 */
enum DAY{
    MON=1, TUE, WED, THU, FRI, SAT, SUN
};


int main(){
    /* 定義一個枚舉類型變量 */
    enum DAY day;
    
    /* 枚舉類型變量使用枚舉值 */
    day = WED;
    
    printf("Day num is %d", day);
    return 0;
}
           

我們也可以在定義枚舉類型時改變枚舉元素的值:

enum season {spring, summer=3, autumn, winter};
           

沒有指定值的枚舉元素,其值為前一進制素加 1。也就說 spring 的值為 0,summer 的值為 3,autumn 的值為 4,winter 的值為 5。

#include <stdio.h>

enum DAY{
    MON=1, TUE, WED, THU, FRI, SAT, SUN
};

int main(){
    int i;

    for(i = MON; i < SUN; i++){
        printf("Day is %d\n", i);
    }
    return 0;
}
           
enum{
    ENUM_0,
    ENUM_10 = 10,
    ENUM_11
};
           
#include <stdio.h>
#include <stdlib.h>

int main(){
    enum COLOR{
        red=1,
        green,
        blue,
    };

    enum COLOR favorite_color;

    printf("Input your favorite color:");
    /* %u for unsigned integer type*/
    scanf("%u", &favorite_color);

    switch(favorite_color){
        case red:
            printf("red.");
            break;
        case green:
            printf("green.");
            break;
        case blue:
            printf("blue.");
            break;
        default:
            printf("None.");
    }
    return 0;
}
           
#include <stdio.h>
#include <stdlib.h>

int main(){

    enum DAY{
        MON=1, TUE, WED, THU, FRI, SAT, SUN
    } weekend;

    int a = 7;
    weekend = (enum DAY) a;
    // weekend = a 錯誤

    printf("weekend: %d", weekend);
    return 0;
}