以下に示すようにenumを宣言すると、すべてのCコンパイラはデフォルト値をx=0
,y=1
、z=2
と設定していますか?Cのデフォルト列挙値はすべてのコンパイラで同じですか?
typedef enum {
x,
y,
z
} someName;
以下に示すようにenumを宣言すると、すべてのCコンパイラはデフォルト値をx=0
,y=1
、z=2
と設定していますか?Cのデフォルト列挙値はすべてのコンパイラで同じですか?
typedef enum {
x,
y,
z
} someName;
はい。列挙型の定義で別途指定しない限り、最初の列挙子は常に値0を持ち、後続の各列挙子の値は前の列挙子よりも大きい値です。
であり、CとC++の両方で同じ動作が必要です。 C++では '[dcl.enum]'です: "最初の 列挙子に初期化子がない場合、対応する定数の値はゼロです。列挙子定義 は、初期化子がないと列挙子に以前の列挙子は1つ。 " –
はい、そしてC#のように文字Cで始まる他の言語もあります。 –
C99標準
N1265 C99 draftは6.7.2.2/3 "列挙指定子"
で=定数式の値としての列挙定数を定義すると列挙子を言います。最初の列挙子が
=
でない場合、その列挙定数の値は0です。no = の各列挙子は、その列挙定数を前の列挙定数の値に1を加算した定数式の値として定義します。 (=と列挙子の使用は、同じ列挙内の他の値を重複値で列挙定数を生成してもよい。)
そこで常に以下に準拠実装で成り立つ
enum E {
E0,
E1,
E2 = 3,
E3,
E4 = INT_MAX,
/* Compile time error: Overflow in enumeration values */
/*E5*/
};
/* If unspecified, the first is 0. */
assert(E0 == 0);
assert(E1 == 1);
assert(E2 == 3);
/* Continue from the last one. */
assert(E3 == 4);
assert(E4 == INT_MAX);
はい、列挙値bydefult 0からn番目の要素から任意のプラットフォームに開始します。
回答が回答のプールにどのように追加されるかを考慮してください。つまり、あなたの新しい答え(5年後)は、別の答えでカバーされていない新しいものをどのように追加しますか?一見すると、それは他の2つの回答よりも有益ではないようです。 – LawfulEvil
Ehhh @LawfulEvilはリラックスしています。複数の答えは、今後これを複数の視点で見ている人々に与えます。つまり、これはフォーマットの悪い、有益ではない回答ですが、それ自体での十分な答えは悪くありません。 –
はい、標準で要求されており、誰かがそれを引用できると確信しています。 – Nemo