列挙型 | Programming Place Plus 用語集

トップページ用語集

名称 🔗

解説 🔗

プログラミング言語データ型の一種で、複数の名前付き定数を1つの集合として定義したものです。

それぞれの名前付き定数を列挙子と呼びます。列挙子の名前はプログラマーが決定でき、そのは通常、なにかしらの整数型です。

列挙子の値は(たとえばコンパイラによって)自動的に割り当てられます(プログラミング言語によっては、プログラマーが指定できることもあります)。そのため、トランプのマーク(スート)や、ABO で表される血液型のように、列挙子が持つ具体的な値が何であるかには興味がなく(たとえば、計算に使うつもりがない)、ある1つの集合に属するものが何であるかだけを定義したい場合に用いることが多いです。

同じ名前の列挙子を重複させることはできませんが、同じ値を持った列挙子が複数ある(つまり別名を持たせる)ことは許されます。

定義された列挙型を、変数仮引数戻り値などの型として用いることができます。与えられる値は、その列挙型に含まれる列挙子のいずれかです。とりうる値のパターンが限定され、明確な名前も付いていることから、int のような単純な整数型を使うよりも、プログラム可読性や安全性が高まる効果があります。

C言語の場合

C言語では enum というキーワードを使って定義します。

enum BloodType_tag {
    BloodTypeA,
    BloodTypeB,
    BloodTypeAB,
    BloodTypeO
};

最初の列挙子である BloodTypeA には int型の 0 が割り当てられ、以降に続く列挙子は 1 ずつ値が大きくなるように自動的に採番されます。明示的に定数式を与えることも許され、その場合は後続の列挙子にはその続きの値が割り当てられます。定数式は int型で表現できる値にならなければなりません。

enum BloodType_tag {
    BloodTypeA,
    BloodTypeB = 100,
    BloodTypeAB,  // 101
    BloodTypeO    // 102
};

「列挙子」という用語には「= 定数式」の部分も含まれます(もちろん無くても構わない)。名前の部分だけを指して列挙定数という用語も存在します。

定義された列挙型の変数を宣言できます。

enum BloodType_tag blood_type = BloodTypeAB;

残念ながらC言語は型のチェックが甘く、無関係な値を与えることができてしまう致命的な欠陥があります。

enum BloodType_tag blood_type = 345;  // OK

なお、型としての呼び名は列挙型ですが、概念としては列挙体と呼ぶ場合があります(構造体と構造体型、共用体と共用体型と同様の対応関係)。

C言語の列挙型についての詳細は、C言語編「列挙型」を参照してください。

C++ の場合

C++ には、C言語のものに近い列挙型があります。また、C++11 で scoped enum と呼ばれる新しい列挙型が追加されており、C言語から引き継いだ列挙型には unscoped enum という名称が与えられました。

scoped enum は、enumキーワードのほか、classキーワードあるいは structキーワードを使って定義します(どちらを使っても同じです)。

enum class BloodType {
    A,
    B,
    AB,
    O
};

scoped enum の列挙子を用いる際には、列挙型の名前(列挙名)と、スコープ解決演算子(::)を組み合わせて記述しなければなりません。そのため、列挙子の名前にまで列挙名(BloodType)を繰り返す必要はありません。

BloodType blood_type = BloodType::AB;

型のチェックも厳密になっており、存在する列挙子以外の値を与えると、コンパイルエラーとして検出されます。

BloodType_tag blood_type = 345;  // コンパイルエラー

C++ の列挙型では、内部的に用いられる整数型の種類(基底型)を指定できます。省略した場合は、scoped enum では int型、unscoped enum では処理系定義の型となります。

// 基底型を long long型にする
enum class BloodType : long long {
    A,
    B,
    AB,
    O
};

// unscoped enum でも可
enum BloodType : long long {
    BloodTypeA,
    BloodTypeB,
    BloodTypeAB,
    BloodTypeO
};

C++ の列挙型についての詳細は、新C++編「列挙型」を参照してください。


参考リンク 🔗

更新履歴 🔗


用語集のトップページへ

Programming Place Plus のトップページへ



はてなブックマーク に保存 Pocket に保存 Facebook でシェア
X で ポストフォロー LINE で送る noteで書く
rss1.0 取得ボタン RSS 管理者情報 プライバシーポリシー
先頭へ戻る