枚舉類型

枚舉類型

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

概念

在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");

相關詞條

熱門詞條

聯絡我們