概念
在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 ;注意類型一致不能出界;
②關係運算 IF
③輸入 枚舉變數的值只能用賦值語句獲得,不要用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");