回答:
はい。列挙の定義で特に指定しない限り、最初の列挙子の値は常にゼロで、後続の各列挙子の値は前の列挙子より1つ大きくなります。
[dcl.enum]
「最初の列挙子に初期化子がない場合、対応する定数の値はゼロです。初期化子なしの列挙子定義は、前の列挙子の値を1だけ増やした値を列挙子に与えます。」
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でテスト済み。
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」になります。
't'
は保証されていません。文字がアルファベット順に連続していない文字セットが存在する可能性があります
はい、列挙値bydefultは0から任意のプラットフォームのn番目の要素で始まります。