2012-01-10 53 views
0

有這個代碼。枚舉變量的任意值

#include <iostream> 
#include <climits> 
enum e {zero,one}; 
void main() 
{ 
    e num=(e)INT_MAX; 
    std::cout<<num; 
} 

是它由非標準定義的輸出將是2147483647?(條件的sizeof(int)的= 4個字節)

+0

爲什麼要這樣做? – Pubby 2012-01-10 09:27:25

+3

通過簡單的權宜之計,答案是「否」,標準不能保證「int」是32位。 ;-) – DevSolar 2012-01-10 09:28:40

+0

@DevSolar,好的。 + if sizeof(int)= 4byte – eXXXXXXXXXXX2 2012-01-10 09:31:02

回答

3

否;將整數轉換爲枚舉時,枚舉值僅在整數值在範圍內時指定。從標準:

7.2/10算術或枚舉類型的表達式可以顯式轉換爲枚舉類型。如果值在枚舉類型的枚舉值範圍內,則值 不變;否則結果 枚舉值是未指定的。這裏的「範圍」在一個相當複雜的方式在7.2/7所描述的,並且基本上

上升到的2^M-1最小值,該值比最大限定值以下沒有。

編譯器允許使用任何整數類型來表示枚舉,只要它足夠大以容納所有的枚舉值;所以在這種情況下,可以免費使用比int更小的類型,例如char。此外,INT_MAX只保證至少32767

+0

'如果值在枚舉值的範圍內,則值不變'如何定義枚舉值的範圍? – eXXXXXXXXXXX2 2012-01-10 09:38:42

+0

@eXXXXXXXXXXX:所有可能的值都在枚舉的定義中聲明;定義範圍。在你的情況下,你定義了'zero = 0'和'one = 1',所以範圍是'[0,1]',可以用任何類型表示至少一個位。 – 2012-01-10 09:40:31

+0

這保證了什麼:* INT_MAX只保證至少32767 *?有一些奇怪的平臺,其中int爲9位 – 2012-01-10 09:40:34

0

在找不到C++規範的任何直接explenation,但可以很容易地推斷出。 枚舉類型的枚舉是編譯時定義的。如果編譯器看到enum e值很容易適合一個字節,它可以決定使它的類型爲char

這意味着您將無法在此enum中存儲INT_MAX

+0

C++標準第7.2.7段對此進行了定義。 – 2012-01-10 09:50:24

2

首先,有沒有保證,INT_MAX爲2147483647。第二,有沒有保證您的枚舉將能夠存儲2147483647的基本類型,也沒有存儲任何值INT_MAX的是。

現在,如果您想知道是否可以使用沒有定義枚舉器的值,那麼答案是「是」。只要該值符合枚舉的範圍,就可以使用不帶相應枚舉數的值。該範圍內的最大值是最大的2^n - 1,大於或等於所有的統計員。在你的情況下,範圍是[0,1],所以沒有其他值可以以明確的方式使用。

在以下代碼中,枚舉範圍是[0,3],所以即使沒有枚舉器,3也是有效的值。

#include <iostream> 

enum e {zero,one,two}; 
void main() 
{ 
    e num=(e)3; 
    std::cout<<num; // will print "3" 
} 

如果沒有負值的枚舉數,範圍中的最小值爲0。如果存在具有負值的枚舉值,則取決於實現使用的表示。如果實現使用二進制補碼,它是 - (max + 1),否則它只是-max。基本上,如果有負值,範圍有一個以上位:)

#include <iostream> 

enum e {minus_one=-1,zero,one,two}; 
void main() 
{ 
    e num=(e)-3; 
    std::cout<<num; // will print "-3" 
} 

而且在C++ 11可以明確的基本類型,如果你想確保一個值將是可表示:

#include <iostream> 
#include <cstdint> 

enum e : std::int32_t {zero,one}; 
void main() 
{ 
    e num=(e)2147483647; 
    std::cout<<num; // will print "2147483647" 
} 
+0

''只要值符合枚舉的基礎類型,就可以使用沒有相應枚舉數的值。''這是不正確的,至少在C++中03。最大值是'2^k-1',其中'k'是所有枚舉值都適合的最小值。 – 2012-01-10 09:47:33

+0

在你的第一個例子中,'2'不保證被打印出來(至少對於C++ 03來說 - 我不得不查找C++ 11)。存儲在'num'中的值是未指定的。 – 2012-01-10 09:50:09

+0

@詹姆斯:你說得對。我會解決這個問題。 – 2012-01-10 09:50:28

0

用於枚舉類型的範圍內是有效枚舉值被定義爲在C++工作草案,7.2節,第7段如下:

對於枚舉其基礎類型是固定的,的值枚舉ar e基礎類型的值。否則,對於其中emin是最小枚舉數且emax最大的枚舉,枚舉值是在bmin到bmax範圍內的值,定義如下:對於二進制補碼錶示,設K爲1,補碼或符號幅度表示。 bmax是大於或等於max(| emin |?K,| emax |)且等於2^M?的最小值。 1,其中M是一個非負整數。如果emin爲非負值,bmin爲零,否則爲(bmax + K)。如果bmin爲零,則最大位數字段的大小足以容納枚舉類型的所有值,即max(M,1),否則爲M + 1。可以定義一個枚舉值,它的值不是由任何枚舉器定義的。如果枚舉器列表爲空,則枚舉的值就好像枚舉具有值爲0的單個枚舉器。

將算術或枚舉類型轉換爲枚舉類型時,如果值爲在枚舉類型的枚舉值範圍內。否則,值爲未指定的

爲了避免意外的行爲,被轉換的值必須在枚舉值範圍內。此外,如果需要動態檢查超出範圍的值,則必須在轉換之前完成。

0

編號2147483647超出此枚舉的範圍。如果沒有負枚舉,枚舉的範圍是0到2^k-1,其中2^k是所有枚舉都在範圍內的最小冪2。在這種情況下,這將是2^1。因此,對於e,任何大於2的值都會使輸出不確定。

0

enum arg的類型是整型。

enum e{zero, one} 

意味着

int zero = 0; int one =1; 
如果分配INT_MAX到整數類型ARG

結果是2^31

+0

不,底層類型可以是任何足以容納所有值的整數類型。 – 2012-01-10 10:08:16