本章では下記の内容を学習します。
- ある分類項目に名前と数値をつける: 列挙型
- 名前に対応する数値を決める: 列挙値の変更
- 列挙型にあだ名をつける: typedef
列挙型
列挙型の定義
#include <stdio.h>
#include <locale.h>
// 性別を表す列挙型
typedef enum tagSEIBETSU
{
MUKAITOU,
DANSEI,
JOSEI
}
SEIBETSU;
// main関数
int main( void )
{
// 性別列挙型の変数を宣言し、初期値を指定
SEIBETSU sei = DANSEI;
printf( "列挙定数値は%d\n", sei );
// 性別に応じた表示をする
switch( sei )
{
case MUKAITOU:
printf( "無回答です\n" );
break;
case DANSEI:
printf( "男性です\n" );
break;
case JOSEI:
printf( "女性です\n" );
break;
default:
printf( "???\n" );
break;
}
return 0;
}
構造体の例では、性別情報については『0=無回答、1=男性、2=女性』というように、あらかじめ数値を決めておき、それらを元に表示やプログラミングを行ってきました。しかしながら人間と言うのはとかく忘れがちな生き物で、「あれ 2 って性別だと何だったっけ…」となることも多々あると思います。こういった問題を解決するには、人間の記憶に頼るのではなく、より明確に数値と名前に対応関係を作ってしまう方が賢明です。これを実現できるのが列挙型になります。
列挙型は、数値と名前の対応関係を作ることのできるデータ型です。enum
キーワードをつけて定義することができます。
列挙型タグに囲まれた名前たちは、それぞれに固有の数値が割り振られます。つけられた値の事を特に列挙定数と呼び、通常大文字のみで記述します。
プログラム上でこれらの列挙定数を書くと、実行時にはすべて数値に置き換わります。例の tagSEIBETSU では、MUKAITOU が 0、DANSEI が 1、JOSEI が 2 になります。このように基本的には列挙定数は書いた順に 0 から順に割り振られます。
プログラム上で列挙定数を利用すると、数値で管理することに比べて、明確に状態を記述することができるようになります。
例題を改変して、与えられた数値をもとに、性別を文字列で表示する関数 void showSeibetsu( int seibetsu )
を作成してください
構造体の例で作成した PLAYER 構造体の性別メンバを、列挙型に置き換えてください
列挙定数の変更
typedef enum tagSEIBETSU
{
MUKAITOU,
DANSEI = 101,
JOSEI
}
SEIBETSU;
列挙定数の各定数の値を変更することもできます。整数であればどんな値でも OK です。例では男性を 101 にしています。このとき女性の値はいくつになるでしょうか?
列挙定数は、指定しないものについては、1 つ前に書いてある変数の次の値になります。例では女性の値は 102 となります。
列挙定数は、重複が許されます。もし例題で無回答を 101 にしても、重複が許されるため OK となります(例題のプログラムでは意味が重複してしまうのでやってはいけませんが)。また、指定していない列挙定数との重複に気をつけなければなりません。例題で無回答を 102 とした場合、女性と無回答が重複します。どうしてかを考えてみてください。
無回答を 10000、男性を 20000、女性を 20001 に変更してください
列挙型に対する typedef
typedef enum tagSEIBETSU
{
MUKAITOU,
DANSEI = 101,
JOSEI
}
SEIBETSU;
構造体同様、列挙型にも typedef を施して、あだ名をつけることができます。例題ではすでに typedef を行っており、『enum tagSEIBETSU』が『SEIBETSU』とあだ名されて利用されています。