web-dev-qa-db-ja.com

C ++列挙型は0から始まりますか?

列挙に番号を割り当てないenumがある場合、序数値は0になりますか?例えば:

enum enumeration { ZERO,
                   ONE,
                   TWO,
                   THREE,
                   FOUR,
                   FIVE,
                   SIX,
                   SEVEN,
                   EIGHT,
                   NINE };

C99標準には0の序数が必要であるとの引用 を見つけることができました。しかし、C++はC99標準のいくつかのことを無視することを知っています。そして、私は 1の序数値を使用してコンパイラを目撃した後 を見つけることもできました。

私は本当にC++のこれを確認する答えを見たいのですが、序数0がif ifを保持するかどうかも知りたいですenumの中央の値:

enum enumeration { ZERO,
                   ONE,
                   TWO,
                   THREE = 13,
                   FOUR,
                   FIVE,
                   SIX,
                   SEVEN,
                   EIGHT,
                   NINE };
43
Jonathan Mee

その標準ごと[dcl.enum]

Enumのみのenum-keyで宣言された列挙型は、スコープなし列挙であり、その列挙子はスコープなし列挙子です。 enum-keys enumクラスとenum structは意味的に同等です。これらのいずれかで宣言された列挙型はスコープ付き列挙であり、その列挙子はスコープ付き列挙子です。スコープ付き列挙の宣言では、オプションの識別子を省略しないでください。 enum-baseのtype-specifier-seqは、整数型を指定します。 cv-qualificationは無視されます。スコープのない列挙を宣言するopaqueenum-declarationは、enum-baseを省略しません。 enumerator-listの識別子は定数として宣言され、定数が必要な場所に表示できます。 =を持つenumeratordefinitionは、関連付けられた列挙子に、constant-expressionで示される値を与えます。 最初の列挙子に初期化子がない場合、対応する定数の値はゼロです初期化子のない列挙子定義は、前の列挙子の値を1増やした値を列挙子に与えます。

重点鉱山

そのため、開始値を指定しない場合、デフォルトで0になります。

私は本当にC++のこれを確認する答えを見たいのですが、enumの途中で値を指定しても序数0が保持されるかどうかを知りたいです:

これも機能します。 0から始まり、途中で増加します。その後、列挙型に値を割り当てると、次の値に対してその値から増加し始めます。

44
NathanOliver

C++ 11仕様(7.2/2)から:

最初のenumeratorinitializerがない場合、対応する定数の値はゼロです。 初期化子なしのenumerator-definitionは、enumeratorに、前のenumeratorの値を増やした値を与えます1。

そのため、列挙の最初の識別子の値は0になり(明示的に別の値に初期化されていない場合)、連続する各識別子の値は前の1になります。

25

§7.2、p 165から

。最初の列挙子に初期化子がない場合、対応する定数の値はゼロです

ソース: http://open-std.org/JTC1/SC22/WG21/docs/papers/2015/n4527.pdf

6
Richard Hodges