Cのデフォルトの列挙値はすべてのコンパイラで同じですか?


107

下図のように列挙型を宣言すると、すべてのCコンパイラは、デフォルト値を設定しないx=0y=1z=2の両方のLinuxとWindowsのシステムでは?

typedef enum {
    x,
    y,
    z
} someName;

3
はい、それは規格によって要求されており、誰かがそれらを引用できると確信しています。
ニモ

回答:


115

はい。列挙の定義で特に指定しない限り、最初の列挙子の値は常にゼロで、後続の各列挙子の値は前の列挙子より1つ大きくなります。


14
また、この同じ動作はCとC ++の両方で必要です。C ++では、[dcl.enum]「最初の列挙子に初期化子がない場合、対応する定数の値はゼロです。初期化子なしの列挙子定義は、前の列挙子の値を1だけ増やした値を列挙子に与えます。」
Ben Voigt

3
はい、CのようにCで始まる他の言語も同様です。
James McNellis、2011年

70

C99標準

N1265 C99ドラフトは 6.7.2.2/3「列挙型指定子」で述べています

=を使用した列挙子は、列挙定数を定数式の値として定義します。最初の列挙子にがない=場合、その列挙定数の値は0です。=のない後続の各列挙子は、その列挙定数を、前の列挙定数の値に1を加算することによって得られる定数式の値として定義します。(=で列挙子を使用すると、同じ列挙内の他の値と重複する値を持つ列挙定数が生成される場合があります。)

したがって、以下は常に準拠する実装に当てはまります。

main.c

#include <assert.h>
#include <limits.h>

enum E {
    E0,
    E1,
    E2 = 3,
    E3 = 3,
    E4,
    E5 = INT_MAX,
#if 0
    /* error: overflow in enumeration values */
    E6,
#endif
};

int main(void) {
    /* If unspecified, the first is 0. */
    assert(E0 == 0);
    assert(E1 == 1);
    /* Repeated number, no problem. */
    assert(E2 == 3);
    assert(E3 == 3);
    /* Continue from the last one. */
    assert(E4 == 4);
    assert(E5 == INT_MAX);
    return 0;
}

コンパイルして実行:

gcc -std=c99 -Wall -Wextra -pedantic -o main.out main.c
./main.out

Ubuntu 16.04、GCC 6.4.0でテスト済み。


7

enum変数の最初の値が初期化されていない場合、Cコンパイラは自動的に値0を割り当てます。コンパイラは、先行するenum変数の値を1ずつ増やし続けます。

例えば:

enum months{jan,feb,mar}

説明:janの値は0、2月は1、3月は2になります。

enum months{jan=123,feb=999,mar}

説明:1月の値は123、2月は999、3月は1000になります。

enum months{jan='a',feb='s',mar}

説明:janの値は「a」、2月は「s」、3月は「t」になります。


1
mar 't'は保証されていません。文字がアルファベット順に連続していない文字セットが存在する可能性があります
MM

-15

はい、列挙値bydefultは0から任意のプラットフォームのn番目の要素で始まります。


14
回答が回答のプールにどのように追加されるかを検討してください。つまり、新しい回答(5年後)は、別の回答でカバーされていない新しい何かをどのように追加しますか?一見すると、他の2つの回答よりも情報量が少ないようです。
LawfulEvil

2
ええ@LawfulEvilリラックス。複数の回答は、将来これを複数の視点で見る人々に与えます。とは言っても、これは形式が不十分で有益な答えではありませんが、それ自体での十分な答えは悪くありません。
ケニーワーデン2018年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.