プログラミング言語の列挙型とは?
リチャード・ドゥルーリー/アイコニカ/ゲッティイメージズ
列挙の略、列挙型 可変タイプ C (元の K&R ではなく ANSI)、C++、およびC#.アイデアは、代わりに 整数 一連の値を表すために、制限された一連の値を持つ型が代わりに使用されます。
たとえば、虹の色を使用すると、
- 赤
- オレンジ
- 黄色
- 緑
- 青い
- インジゴ
- バイオレット
列挙型が存在しない場合は、 #定義 (C) または 定数 C++/C# でこれらの値を指定します。例えば
Int が多すぎてカウントできません!
これに関する問題は、他にもたくさんあることです 整数 色より。 violet の値が 7 の場合、 プログラム 変数に 15 の値を割り当てる場合、これは明らかにバグですが、15 は int の有効な値であるため、検出されない可能性があります。
救助のための列挙型
列挙型は、列挙子と呼ばれる一連の名前付き定数で構成されるユーザー定義型です。虹の色は次のようにマッピングされます。
内部的には、コンパイラは int を使用してこれらを保持し、値が指定されていない場合、赤は 0、オレンジは 1 などになります。
列挙型の利点は何ですか?
ポイントは、 虹色 は型であり、同じ型の他の変数のみをこれに割り当てることができます。 C の方が簡単です (つまり、厳密に型付けされていません) が、C++ と C# では、キャストを使用して強制しない限り代入が許可されません。
あなたはこれらにこだわっていません コンパイラ ここに示すように、独自の整数定数をそれらに割り当てることができます。
ブルーとインディゴが同じ値であることは間違いではありません。列挙子にはスカーレットやクリムゾンなどの同義語が含まれる可能性があるためです。
言語の違い
C では、 変数 宣言の前に単語を付ける必要があります 列挙 のように
ただし、C++ では必要ありません。 虹色 列挙型の接頭辞を必要としない特殊な型です。
C# では、次のように型名によって値にアクセスします。
列挙型のポイントは何ですか?
列挙型を使用すると、抽象化のレベルが上がり、プログラマーは、値がどのように格納されてアクセスされるかを気にするのではなく、値が何を意味するかを考えることができます。これにより、バグの発生が減少します。
ここに例があります。 3つの電球が付いた信号機のセットがあります- 赤 、 黄色 と 緑 .英国では、これら 4 つの段階で信号機の順序が変わります。
- 両方 赤 と 黄色 - 交通はまだ停止していますが、ライトが緑色に変わります。
- enum 変数が取り得る値を制限します。
- 列挙型が取り得るすべての可能な値について考える必要があります。
- これらは数値ではなく定数であり、 ソースコード
信号機の例
照明は、制御バイトの下位 3 ビットに書き込むことによって制御されます。これらは、RYG が 3 ビットを表す 2 進数で以下のビット パターンとして配置されます。 R が 1 の場合、赤いライトが点灯します。
この場合、上記の 4 つの状態が値 4 = に対応することが簡単にわかります。 赤 オン、6= 赤 + 黄色 両方オン、1 = 緑 オンおよび 2 = 黄色 の上。
この機能で
列挙型の代わりにクラスを使用する
C++ と C# では、クラスを作成してから 過負荷 演算子 |許可する OR-ing タイプの 信号機 .
列挙型を使用することで、他のビットが電球制御バイトに割り当てられる問題を防ぎます。他のビットの一部がセルフテストまたは「グリーン レーン」スイッチを制御している可能性があります。その場合、これらのビットを通常の使用で設定できるバグが大混乱を引き起こす可能性があります。
確かに、次のビットをマスクします。 SetTrafficlights() 関数 したがって、どのような値が渡されても、下位 3 ビットのみが変更されます。
結論
列挙型には次の利点があります。