讀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;
}
C C 中列舉型別 enum
新手入門 c c 中列舉型別 enum 出處 pconline 2005 02 26 15 47 04 如果乙個變數你需要幾種可能存在的值,那麼就可以被定義成為列舉型別。之所以叫列舉就是說將變數或者叫物件可能存在的情況也可以說是可能的值一一例舉出來。舉個例子來說明一吧,為了讓大家更明白一點,比如乙個...
C C 中列舉型別 enum
如果乙個變數你需要幾種可能存在的值,那麼就可以被定義成為列舉型別。之所以叫列舉就是說將變數或者叫物件可能存在的情況也可以說是可能的值一一例舉出來。舉個例子來說明一吧,為了讓大家更明白一點,比如乙個鉛筆盒中有一支筆,但在沒有開啟之前你並不知道它是什麼筆,可能是鉛筆也可能是鋼筆,這裡有兩種可能,那麼你就...
C C 中列舉型別 enum
如果乙個變數你需要幾種可能存在的值,那麼就可以被定義成為列舉型別。之所以叫列舉就是說將變數或者叫物件可能存在的情況也可以說是可能的值一一例舉出來。舉個例子來說明一吧,為了讓大家更明白一點,比如乙個鉛筆合中有一支筆,但在沒有開啟之前你並不知道它是什麼筆,可能是鉛筆也可能是鋼筆,這裡有兩種可能,那麼你就...