是的,該聲明在C和C++中都是完全有效和可移植的。
在C和C++,這樣:
enum State {DISABLED=0, ENABLED=!DISABLED};
是完全等同於這樣的:
enum State {DISABLED=0, ENABLED=1};
並向該:
enum State {DISABLED, ENABLED};
但微妙的不同的原因。
在C中,一元!
操作者產生int
類型的結果,具有值要麼0
(如果操作數不等於0
)或1
(如果操作數是等於0
)。 !x
相當於x == 0
。 (當用作條件時,任何非零值都視爲true,但運算符!
和==
等總是產生正好爲0
或1
的結果。)枚舉常量始終爲int
;如果指定了值,則必要時將其轉換爲int
。
(C在1999年的標準添加型_Bool
,但其產生邏輯上所有運營商「布爾」值仍然產生int
類型的結果。)
在C++中,一元!
操作符的結果是bool
類型的。結果是false
或true
其中C的!
運營商將分別產生0
或1
。和C一樣,如果指定了一個值,它會根據需要進行轉換; bool
值false
和true
分別轉換爲0
和1
。
在C中,枚舉常量的類型始終爲int
。在C++中,它們是枚舉類型,在此例中爲enum State
。
引用同一類型聲明中較早的枚舉常量是合法的。每個枚舉常量在聲明後都可見。
至於類似:
enum bool { false = 0, true = !false);
更清澈比
enum bool { false = 0, true = 1 };
(在C,它會在C++是非法的),我尊重不同意見。對於熟悉C的人來說,常數1
是完全清楚的。將其重寫爲!false
沒有幫助。事實上,當<stdbool.h>
不可用(東西是罕見的,這些天),我用:
typedef enum { false, true } bool;
是false
和true
將給予他們正確的價值觀,這一事實是恕我直言十分明顯的。至於爲什麼C99沒有使用像這樣的enum
定義,我懷疑這是因爲每個枚舉類型都與一些實現定義的整數類型兼容。 (對於gcc,通常是unsigned int
或int
。)該委員會要求_Bool
是一個不同類型的轉換等級低於任何其他整數類型的轉換等級。 (並且他們不能在不破壞現有代碼的情況下使bool
成爲關鍵字。)
ANSI是否符合?這是我一段時間沒聽說過的一句話。 –
@DawidPi C和C++是不同的語言,像這樣的微妙問題幾乎從來沒有得到一個同時涵蓋兩種語言的好答案。如果你真的想知道兩種語言,請將它們作爲單獨的問題詢問。 – hvd
@AlanStokes如果您在編輯時遇到了問題,我在評論中特別說明了這一點,但在沒有任何評論的情況下將其恢復原樣似乎很粗魯。我不想捲入這場關於回滾的戰爭,但就我而言,這個問題在原來的狀態下過於寬泛,如果你想阻礙嘗試將它變成適當的形狀,那麼罰款,我只是投票結束。 (當然,這當然不意味着它實際上最終會關閉。) – hvd