はい、宣言はCとC++の両方で完全に有効で移植性があります。 CおよびC++の両方において
は、この:
enum State {DISABLED=0, ENABLED=!DISABLED};
はこれに全く等価である:
enum State {DISABLED=0, ENABLED=1};
及びこれ:
enum State {DISABLED, ENABLED};
しかし微妙に異なる理由のために。 Cにおいて
(オペランドは0
に等しい場合)、単項!
オペレータが値0
(オペランドは0
に等しくない場合)、または1
のいずれかで、タイプint
の結果が得られます。 !x
はx == 0
に相当します。 (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 = 1 };
より明確であること
enum bool { false = 0, true = !false);
(Cで、それはC++で違法になります)、私は丁重に反対します。定数1
は、Cに精通している人にとっては完全にはっきりしています。!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