列挙型

    2012/06/29

    本章では下記の内容を学習します。

    • ある分類項目に名前と数値をつける: 列挙型
    • 名前に対応する数値を決める: 列挙値の変更
    • 列挙型にあだ名をつける: typedef

    列挙型

    列挙型の定義

    例1-列挙型の定義と利用
    #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構造体への適用

    構造体の例で作成した PLAYER 構造体の性別メンバを、列挙型に置き換えてください

    列挙定数の変更

    例2-列挙定数の変更
    typedef enum tagSEIBETSU
    {
      MUKAITOU,
      DANSEI      = 101,
      JOSEI
    }
    SEIBETSU;
    

    列挙定数の各定数の値を変更することもできます。整数であればどんな値でも OK です。例では男性を 101 にしています。このとき女性の値はいくつになるでしょうか?

    列挙定数は、指定しないものについては、1 つ前に書いてある変数の次の値になります。例では女性の値は 102 となります。

    列挙定数は、重複が許されます。もし例題で無回答を 101 にしても、重複が許されるため OK となります(例題のプログラムでは意味が重複してしまうのでやってはいけませんが)。また、指定していない列挙定数との重複に気をつけなければなりません。例題で無回答を 102 とした場合、女性と無回答が重複します。どうしてかを考えてみてください。

    練習問題: 列挙定数の変更

    無回答を 10000、男性を 20000、女性を 20001 に変更してください

    列挙型に対する typedef

    例3-列挙型のあだ名をつける
    typedef enum tagSEIBETSU
    {
        MUKAITOU,
        DANSEI      = 101,
        JOSEI
    }
    SEIBETSU;
    

    構造体同様、列挙型にも typedef を施して、あだ名をつけることができます。例題ではすでに typedef を行っており、『enum tagSEIBETSU』が『SEIBETSU』とあだ名されて利用されています。