複製鏈接
請複製以下鏈接發送給好友

枚舉類型

鎖定
枚舉類型在C#或C++,java,VB等一些計算機編程語言中是一種基本數據類型而不是構造數據類型,而在C語言等計算機編程語言中是一種構造數據類型 [1]  。它用於聲明一組命名的常數,當一個變量有幾種可能的取值時,可以將它定義為枚舉類型。
枚舉可以根據Integer、Long、Short或Byte中的任意一種數據類型來創建一種新型變量。這種變量能設置為已經定義的一組之中的一個,有效地防止用户提供無效值。該變量可使代碼更加清晰,因為它可以描述特定的值。
中文名
枚舉類型
外文名
Enumeration types
行    業
編程
使用場景
計算機編程

枚舉類型概念

在C#或C++,java等一些計算機編程語言中,枚舉類型是一種基本數據類型而不是構造數據類型,而在C語言等計算機編程語言中,它是一種構造數據類型。枚舉類型用於聲明一組命名的常數,當一個變量有幾種可能的取值時,可以將它定義為枚舉類型。
定義:是指將變量的值一一列出來,變量的值只限於列舉出來的值的範圍內.
使用格式:枚舉類型放在窗體模塊標準模塊或共用模塊中的聲明部分,通過enum語句來定義。
.格式:[public|private] enum name
membername[=constantexpression]
membername[=constantexpression]
(maomi)
…..
End enum
public:表示該枚舉類型在整個工程中都是可見的(缺省的)
private:表示枚舉類型只在所聲明的模塊中是可見的。Name: 枚舉類型的名稱。必須是一個合法的VB標識符,在定義該枚舉類型的變量或參數時用該名稱來指定類型.
Membername:指定該枚舉類型的組成元素名稱.
Constantexpression:枚舉類型的組成元素的值.如果沒有指定具體值,則所有賦的值或者是0或者比其直接前驅的值大1.元素的值也可以是別的enum類型.VB中將枚舉中的元素的值按長整數處理.如果將一個浮點數值賦給一個枚舉中的元素,VB會將該值取整為最接近的長整數.

枚舉類型枚舉成員

枚舉變量聲明與賦值: 定義枚舉類型後,可以聲明該枚舉類型的變量,然後使用該變量存儲枚舉元素的數值.
枚舉變量:指用枚舉類型定義的變量.變量和參數都可以定義為枚舉類型.過程的返回值也可以是枚舉類型.
格式:dim 枚舉變量名 as 枚舉類型名
注意:儘管通常只將枚舉元素數值賦給枚舉類型的變量,但也可以將任何長整數數值賦給該變量.當對與枚舉常數不相關的變量賦值時,Vb 不會產生錯誤.
枚舉語句只能在模塊級別中出現,不能用模塊名來限定枚舉類型.
(1)枚舉的聲明:枚舉聲明用於聲明新的枚舉類型。
訪問修辭符 enum 枚舉名:基礎類型
{
    枚舉成員,
    枚舉成員,
    ...
};
基礎類型必須能夠表示該枚舉中定義的所有枚舉數值。枚舉聲明可以顯式地聲明 byte、sbyte、short、ushort、int、uint、long 或 ulong 類型作為對應的基礎類型。沒有顯式地聲明基礎類型的枚舉聲明意味着所對應的基礎類型是 int。
(2)枚舉成員
枚舉成員是該枚舉類型的命名常數。任意兩個枚舉成員不能具有相同的名稱。每個枚舉成員均具有相關聯的常數值。此值的類型就是枚舉的基礎類型。每個枚舉成員的常數值必須在該枚舉的基礎類型的範圍之內。
示例:
public enum TimeofDay:uint

{
    
    Morning=-3,
    
    Afternoon=-2,
    
    Evening=-1

};
產生編譯時錯誤,原因是常數值 -1、-2 和 –3 不在基礎整型 uint 的範圍內。
(3)枚舉成員默認值
在枚舉類型中聲明的第一個枚舉成員它的默值為零。
以後的枚舉成員值是將前一個枚舉成員(按照文本順序)的值加 1 得到的。這樣增加後的值必須在該基礎類型可表示的值的範圍內;否則,會出現編譯時錯誤。
示例:
public enum TimeofDay:uint
{
    Morning,
    Afternoon,
    Evening
};

Morning的值為0,Afternoon的值為1,Evening的值為2。
(4)為枚舉成員顯示賦值
允許多個枚舉成員有相同的值.
沒有顯示賦值的枚舉成員的值,總是前一個枚舉成員的值+1.
示例
public enum Number
{
    a=1,
    b,
    c=1,
    d
};

b的值為2,d的值為2.
注意:以上枚舉值都不能超過它的基礎類型範圍。否則會報錯.
(5)枚舉類型與基礎類型的轉換
基礎類型不能隱式轉換為枚舉類型
枚舉類型也不能隱式轉換為基礎類型
示例
public enum Number
{
    a,
    b,
    c,
    d
};

class Test
{
    public static void Main()
    {
        int i=Number.a;//錯誤,要強制類型轉換(int)Number.a
        Number n;
        n=2 //錯誤,要強制類型轉換(Number)2
    }
}

(6)System.Enum類型
System.Enum 類型是所有枚舉類型的抽象基類,並且從 System.Enum 繼承的成員在任何枚舉類型中都可用。
System.Enum 本身不是枚舉類型。相反,它是一個類類型,所有枚舉類型都是從它派生的。
System.Enum 從類型 System.ValueType派生
(7)使用枚舉類型
using System;
public enum TimeofDay
{
    Morning,
    Afternoon,
    Evening
};
class Test
{
    static void WriteGreeting(TimeofDay timeofDay)
    {
        switch(timeofDay)
        {
            case TimeofDay.Morning:
                Console.WriteLine("good morning");
                break;
            case TimeofDay.Afternoon:
                Console.WriteLine("good afternoon");
                break;
            case TimeofDay.Evening:
                Console.WriteLine("good evening");
                break;
        }
    }
    static void Main()
    {
        WriteGreeting(TimeofDay.Morning);
        WriteGreeting(TimeofDay.Evening);
        WriteGreeting(TimeofDay.Afternoon);
    }
}

枚舉類型操作

①賦值運算 COLOR:=RED ;注意類型一致不能出界;
③輸入 枚舉變量的值只能用賦值語句獲得,不要用READ語句;
④輸出 不能直接用WRITE語句直接輸出枚舉元素,系統會認為它是一個
未定義的變量名;必須賦給一個枚舉變量,然後輸出給變量的值;
如果想要用READ和WRITE語句,怎麼辦?
VAR I:INTEGER;
COLOR:(RED,YELLOW,BLUE);
BEGIN
WRITELN(‘0—RED ,1—YELLOW ,2—BLUE ’);
READLN(I);
CASE I OF
:COLOR:=RED;:COLOR:=YELLOW;:COLOR:=BLUE END;
{ 數據處理 }
CASE COLOR OF
RED :WRITELN(‘RED’);
YELLOW:WRITELN(‘YELLOW’);
BLUE:WRITELN(‘BLUE’)
END;
END.

枚舉類型應用舉例

例二:一家水果店出售4種水果,每千克價格分別是:蘋果1.15元,桔子1.20元,香蕉0.95元,菠蘿0.85元。編一程序使售貨員主要從鍵盤上打入貨品的代碼及重量,計算機將顯示貨品名、單價、重量及總價。貨品代碼為蘋果1,桔子2,香蕉3,菠蘿4。
CONST PA=1.15;PO=1.20;PB=0.95;PP=0.85;
TYPE FRUITTYPE =(APPLE,ORANGE,BANANA,PINEAPPLE);
VAR TOTAL,WEIGHT,P:REAL; { 重量和價格 }
CODE:INTEGER; { 代碼 }
FRUIT:FRUITTYPE;
BEGIN
READLN(CODE,WEIGHT);
WHILE (CODE>=1)AND (CODE<=4)DO
BEGIN
CASE CODE OF
1 : FRUIT:=APPLE;
2 : FRUIT:=ORANGE;
3 : FRUIT:=BANANA;
4 : FRUIT:=PINEAPPLE;
END;
CASE FRUIT OF
APPLE : BEGIN WRITE(‘APPLE’); P:=PA END;
ORANGE: BEGIN WRITE(‘ORANGE’); P:=PO END;
BANANA : BEGIN WRITE(‘BANANA’); P:=PB END;
PINEAPPLE : BEGIN WRITE(‘PINEAPPLE’); P:=PP END;
END;
WRITE(P:6:2, ‘ * ’, WEIGHT:6:2 , ‘ = ’);
WRITELN(p*WEIGHT:8:2);
READLN(CODE,WEIGHT);
END;
END.
C中示例:
typedef enum {
DEMO_LABEL_A = 0,
DEMO_LABEL_B,
DEMO_LABEL_C
DEMO_LABEL_D
} demo_label_t;
demo_label_t demo_label;
/* 對demo 的賦值操作 */
if (demo_label == DEMO_LABEL_C)
printf ("the label is C");
參考資料
  • 1.    黃思先 劉必雄 主編.程序設計基礎教程(C語言版):科學出版社,2011年:90