C與C 中的enum型別使用

2021-06-19 12:09:49 字數 2538 閱讀 5491

1.enum常量與enum變數

對於enum型別,定義enum時在{}中定義的屬於enum常量,這些量不可以被更改,同時可以在程式中任意地方宣告乙個enum變數,但enum變數必須用enum常量進行賦值。

enum myenum ;

.......

enum enumvar = first;//enum變數用enum常量進行賦值初始化,這裡注意要在乙個命名空間內。

2.在c語言中對於enum型別:

k&r的the   c   programmingh   language   2nd,書中說:「儘管可以宣告enum型別的變數,但編譯器不檢查這種型別的變數中儲存的值是否為該列舉的有效值。不過,列舉變數提供這種檢查,因此列舉比#define更具優勢。」

列舉變數提供這種檢查,什麼意思?列舉變數會自己檢?當然不是,作者也許想說程式設計師自己可以寫個程式檢查付給列舉變數的值是否為該列舉的有效值。

/*包含標頭檔案 

*/#include 

<

stdio.h

>

/*列舉型別 

*/enum

months;

/*函式原型 

*/void

enumeration(

enum

months m);

main()

/*enumeration函式:檢測列舉變數儲存的值是否為該列舉的有效值 

*/void

enumeration(

enum

months m)}

而這段**如果改為c++原始檔編譯,卻不能通過。原因如下:

根據c標準的規定,列舉常量的型別為int,列舉變數的型別應該與char、有符號或無符號整型相容。因此,列舉變數可以接受 char、有符號或無符號整型數,而不限於僅從此列舉型別所定義的列舉常量中取值。由於上述原因,在c語言中無法從語法上保證列舉變數只能在定義的列舉成員中取值,只能由程式設計師自身保證不使用除列舉成員之外的值。

關於這一點,很多介紹c語言的書上或者資料上的描述是不正確的,應該加以注意。

但是,如果給列舉變數賦列舉成員之外的值,有的編譯器可能會對此產生警告,有的則不會。因為這種行為不違反c標準的規定,編譯器對此如何反應都是有道理的。

然而對於c++來說,編譯器會禁止給列舉變數賦予列舉成員之外的值。這是因為c++是一種強型別語言,列舉型別不等同於 int 等其它型別。雖然列舉型別可以隱式轉化為 int 等型別,但是 int 等型別卻不能自動轉化為列舉型別,除非使用強制型別轉化。因此,如果不使用強制型別轉化的話,給列舉變數賦值則只能從列舉成員中選擇。對於列舉型別要避免使用強制型別轉換。原因如下:

the   c++   programming   language上說:   

如果某個列舉中所有列舉值非負,列舉的表示範圍為[0 : 2^k-1];其中2^k是使所有列舉成員位於此範圍內的最小的2的冪;如果是負的,就是[-2^k : 2^k-1]。 因此對乙個給定的整數值,如果使用強制型別轉換,而其值又不在列舉的表示範圍以內,其行為是未定義的。

//包含標頭檔案  

#include 

<

iostream.h

>

intmain();//

enum months a = 1;              

//cannot convert from 'const int' to 'enum main::months'

enum

months a =(

enum

months)1;

cout 

<<

"a: 

"<<

a <<

endl;    

//輸出: a: 1

enum

months b =(

enum

months)10;

cout 

<<

"b: 

"<<

b <<

endl;    

//輸出: b: 10 雖然輸出10,但結果是未定義的,因為此列舉的表示範圍為:0~3

return0;

} 3.列舉型別的作用域問題

在c++中使用列舉型別不需要像c#中那樣需要型別名作為識別符號的一部分,如http在c#中需要用transprotocol::http。這樣在大型專案中將可能會出現命名衝突的問題,通常主要有幾種解決方法。

1) 加字首。例如,為transprotocol的第乙個成員都增加乙個字首etp_,即:

enum transprotocol ;

2) 使用命名空間,例如

namespace transprotocol ; }

這樣,在用到http或ftp時就需要在前面加上域識別符號transprotocol::http。

3) 將enum定義為類的巢狀型別。

其實,後兩種方案用法基本相同,可以根據引用所定義列舉的範圍選擇使用,不推薦使用第1種方法。

C 中的enum型別

enum的基本結構 enum 列舉名 列舉變數 如果列舉沒有初始化,即省掉 整型常數 時,則從第乙個識別符號開始,依次 次賦給識別符號0,1,2,enum型別的本質可以參考這個部落格 enum型別的本質 下面是我自己試探的幾個 1.enum型別的成員是整型的,所以可以如下 include using...

enum 在c中的使用 列舉型別)

如果乙個變數你需要幾種可能存在的值,那麼就可以被定義成為列舉型別。之所以叫列舉就是說將變數或者叫物件可能存在的情況也可以說是可能的值一一例舉出來。舉個例子來說明一吧,為了讓大家更明白一點,比如乙個鉛筆盒中有一支筆,但在沒有開啟之前你並不知道它是什麼筆,可能是鉛筆也可能是鋼筆,這裡有兩種可能,那麼你就...

enum 在c中的使用 列舉型別)

如果乙個變數你需要幾種可能存在的值,那麼就可以被定義成為列舉型別。之所以叫列舉就是說將變數或者叫物件可能存在的情況也可以說是可能的值一一例舉出來。舉個例子來說明一吧,為了讓大家更明白一點,比如乙個鉛筆盒中有一支筆,但在沒有開啟之前你並不知道它是什麼筆,可能是鉛筆也可能是鋼筆,這裡有兩種可能,那麼你就...