c言語における列挙

12617 ワード

c言語における列挙
列挙(または列挙)は、Cにおけるユーザ定義のデータ型である.主に積分定数に名前を割り当て、プログラムの読み取りとメンテナンスを容易にするために使用されます.
列挙は相対的に運用も理解も簡単です
例を直接見てみましょう
// An example program to demonstrate working
// of enum in C
#include
 
enum week{Mon, Tue, Wed, Thur, Fri, Sat, Sun};
 
int main()
{
    enum week day;
    day = Wed;
    printf("%d",day);
    return 0;

上記の例では、列挙により変数dayを定義しwedの値をdayに付与する列挙タイプであるため、enumの各名前の値は0、1、2、3、4、5、6である
明らかにwed値は2なのでday=2です.
次の例を見ると、列挙のデフォルト状態がより詳細に表現されています.
#include
 
enum year{Jan, Feb, Mar, Apr, May, Jun, Jul, 
          Aug, Sep, Oct, Nov, Dec};
 
int main()
{
   int i;
   for (i=Jan; i<=Dec; i++)      
      printf("%d ", i);
       
   return 0;
}

この例では、forループはi=0からi=11に実行されます.なぜなら、iの値は最初はJan、0、Decの値は11であるからです.
列挙初期化の興味深い事実について
1、列挙名に値を明示的に割り当てていない場合、コンパイラはデフォルトで0から始まる値を割り当てます.例えば、以下のCプログラムでは、日曜日に値0を取得し、月曜日に1になるようにします.

#include 
enum day {sunday, monday, tuesday, wednesday, thursday, friday, saturday};
 
int main()
{
    enum day d = thursday;
    printf("The day number stored in d is %d", d);
    return 0;
}

みんなはすでに結果を知っているに違いない.
The day number stored in d is 4

2、任意の順序で値の名前を指定できます.他の値が割り当てられていない名前は、前の名前の値を1つ追加します.
#include 
enum day {sunday = 1, monday, tuesday = 5,
          wednesday, thursday = 10, friday, saturday};
 
int main()
{
    printf("%d %d %d %d %d %d %d", sunday, monday, tuesday,
            wednesday, thursday, friday, saturday);
    return 0;
}

結果:1 2 5 6 10 11 12
3、列挙された名前に割り当てられた値は、いくつかのintegeralで一定でなければならない.すなわち、この値は、最小可能な整数値から最大可能な整数値までの範囲でなければならない.
4、すべての列挙定数はその範囲内でユニークであり、例えば、以下のプログラムのコンパイルに失敗した
enum state  {working, failed};
enum result {failed, passed};
 
int main()  { return 0; }

エラー:redeclaration of enumerator"failed'再確認列挙者
列挙とマクロ
マクロを使用して名前定数を定義することもできます.たとえば、次のマクロを使用して、「作業」と「失敗」を定義できます.#define Working 0 #define Failed 1 #define Freezed 2
多くの関連する命名定数が積分値を有する場合、列挙がマクロを上回る利点が複数ある.a)列挙は範囲規則に従う.b)列挙変数は自動的に値を分配する.以下より簡単enum state  {Working, Failed, Freezed}; , !