プログラミング言語のデータ型の一種で、複数の名前付き定数を1つの集合として定義したものです。
それぞれの名前付き定数を列挙子と呼びます。列挙子の名前はプログラマーが決定でき、その値は通常、なにかしらの整数型です。
列挙子の値は(たとえばコンパイラによって)自動的に割り当てられます(プログラミング言語によっては、プログラマーが指定できることもあります)。そのため、トランプのマーク(スート)や、ABO で表される血液型のように、列挙子が持つ具体的な値が何であるかには興味がなく(たとえば、計算に使うつもりがない)、ある1つの集合に属するものが何であるかだけを定義したい場合に用いることが多いです。
同じ名前の列挙子を重複させることはできませんが、同じ値を持った列挙子が複数ある(つまり別名を持たせる)ことは許されます。
定義された列挙型を、変数や仮引数、戻り値などの型として用いることができます。与えられる値は、その列挙型に含まれる列挙子のいずれかです。とりうる値のパターンが限定され、明確な名前も付いていることから、int のような単純な整数型を使うよりも、プログラムの可読性や安全性が高まる効果があります。
C言語では enum というキーワードを使って定義します。
enum BloodType_tag {
,
BloodTypeA,
BloodTypeB,
BloodTypeAB
BloodTypeO};
最初の列挙子である BloodTypeA
には int型の
0
が割り当てられ、以降に続く列挙子は 1
ずつ値が大きくなるように自動的に採番されます。明示的に定数式を与えることも許され、その場合は後続の列挙子にはその続きの値が割り当てられます。定数式は
int型で表現できる値にならなければなりません。
enum BloodType_tag {
,
BloodTypeA= 100,
BloodTypeB , // 101
BloodTypeAB// 102
BloodTypeO };
「列挙子」という用語には「= 定数式」の部分も含まれます(もちろん無くても構わない)。名前の部分だけを指して列挙定数という用語も存在します。
定義された列挙型の変数を宣言できます。
enum BloodType_tag blood_type = BloodTypeAB;
残念ながらC言語は型のチェックが甘く、無関係な値を与えることができてしまう致命的な欠陥があります。
enum BloodType_tag blood_type = 345; // OK
なお、型としての呼び名は列挙型ですが、概念としては列挙体と呼ぶ場合があります(構造体と構造体型、共用体と共用体型と同様の対応関係)。
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::AB; BloodType blood_type
型のチェックも厳密になっており、存在する列挙子以外の値を与えると、コンパイルエラーとして検出されます。
= 345; // コンパイルエラー BloodType_tag blood_type
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で書く |
RSS | 管理者情報 | プライバシーポリシー |