列挙
列挙型は、明示的に名前付けされた定数 (列挙定数) の値を含む、ベースとなる型 (後述) の値を持つ、独立した型です。
目次 |
[編集]構文
列挙型は宣言の文法の type specifier として以下の列挙指定子を用いて宣言されます。
enum identifier(オプション){ enumerator-list } | |||||||||
ただし、 enumerator-list は enumerator のコンマ区切りのリストです (末尾にもコンマがあっても構いません)(C99以上)。 それぞれの enumerator は以下の形式を持ちます。
enumeration-constant | (1) | ||||||||
enumeration-constant= constant-expression | (2) | ||||||||
ただし、
identifier, enumeration-constant | - | この宣言によって導入される識別子。 |
constant-expression | - | int 型の値として表現可能な値を持つ整数定数式。 |
構造体または共用体と同様に、列挙型および1個以上の列挙定数を導入する宣言は、その型およびそれから派生した型の1個以上のオブジェクトも宣言することがあります。
enum color { RED, GREEN, BLUE } c = RED, *cp =&c;// 型 enum color、// 整数定数 RED、 GREEN、 BLUE、// enum color 型のオブジェクト c、および// enum color へのポインタ型のオブジェクト cp を導入します。
[編集]説明
列挙指定子の本体内に現れるそれぞれの enumeration-constant は、囲っているスコープの int 型の整数定数になり、整数定数が必要な任意の場所 (case ラベルや VLA でない配列のサイズなど) で使用できます。
enumeration-constant の後に = constant-expression が続く場合は、その値はその定数式の値になります。 enumeration-constant の後に = constant-expression が続かない場合は、同じ列挙の直前の列挙子の値より1大きな値になります。 最初の列挙子の値はゼロです (= constant-expression が使用されない場合)。
enum Foo { A, B, C=10, D, E=1, F, G=F+C };// A=0, B=1, C=10, D=11, E=1, F=2, G=12
identifier (もしあれば) 自身は、タグ名前空間内のその列挙型の名前になり、キーワード enum の使用が必要です (通常の名前空間内に typedef されない限り)。
enum color { RED, GREEN, BLUE };enum color r = RED;// OK。// color x = GREEN: // エラー、通常の名前空間に color は存在しません。typedefenum color color_t; color_t x = GREEN;// OK。
各列挙型は char、符号付き整数型、または符号なし整数型のいずれかと互換です。 特定の列挙型がどの型と互換かは処理系定義ですが、それが何であれ、その列挙のすべての列挙子の値を表現できる型でなければなりません。
列挙型は整数型であるため、整数型が使用可能な任意の場所 (暗黙の変換や算術演算子も含みます) で使用できます。
enum{ ONE =1, TWO } e;long n = ONE;// 昇格。double d = ONE;// 変換。 e =1.2;// 変換。 e は ONE になります。 e = e +1;// e は TWO になります。
[編集]ノート
構造体または共用体と異なり、 C には列挙の前方宣言はありません。
enum Color;// エラー、 C には列挙に対する前方宣言はありません。enum Color { RED, GREEN, BLUE };
列挙により #define よりも便利かつ構造化された方法で名前付き定数を宣言できます。 これらはデバッガ内で可視であり、スコープの規則に従い、型システムに参加します。
#define TEN 10struct S {int x : TEN;};// OK。
または
enum{ TEN =10};struct S {int x : TEN;};// これも OK。
[編集]例
出力:
List of cable stations: FOX: 11 HBO: 22 MAX: 30
[編集]参考文献
- C11 standard (ISO/IEC 9899:2011):
- 6.2.5/16 Types (p: 41)
- 6.7.2.2 Enumeration specifiers (p: 117-118)