Enum列挙タイプの詳細

2491 ワード

1.列挙の定義列挙タイプ定義の一般形式は以下の通りである.
Enum列挙名{列挙値テーブル};
使用可能なすべての値を列挙値テーブルにリストします.これらの値は列挙要素とも呼ばれます. 
たとえば、この列挙名はweekdayで、列挙値は7つ、すなわち1週間の7日間です.weekdayタイプ変数として説明される値は、7日間のいずれかにすぎません.
2.列挙変数の説明構造と結合のように、列挙変数も異なる方法で説明することができる.すなわち、先に定義してから説明し、同時に説明を定義したり、直接説明したりすることができる.
変数a,b,cは上述のweekdayとして説明され、以下のいずれかの態様を採用することができる.
     enum weekday{ sun,mou,tue,wed,thu,fri,sat };
     enum weekday a,b,c;
あるいは:enum weekday{sun,mou,tue,wed,thu,fri,sat}a,b,c;
あるいはenum{sun,mou,tue,wed,thu,fri,sat}a,b,c;
列挙タイプは使用中に以下の規定がある:1.列挙値は定数であり、変数ではありません.プログラムに付与文を使用して値を付与することはできません.
例えばweekdayを列挙する要素には、sun=5;mon=2; sun=mon; すべて間違いです.
2.列挙要素自体は、システムによってシーケンス番号を表す数値が定義され、0から順に0、1、2...と定義されます.weekdayではsun値が0,mon値が1,...,sat値が6である.
main()
{
     enum weekday 
       { 
           sun,
           mon,
           tue,
           wed,
           thu,
           fri,
           sat
       }a,b,c; 
       a=sun;
       b=mon; 
       c=tue; 
       printf("%d,%d,%d",a,b,c); 
}

説明:列挙値には列挙変数しか与えられず、要素の数値には直接列挙変数を与えることはできません.
例えば、a=sum;b=mon; 正しいです.一方、a=0;b=1; 間違いです.列挙変数に数値を付与するには、強制タイプで変換する必要があります.
例えば、a=(enum weekday)2;シーケンス番号2の列挙要素に列挙変数aを付与することを意味し、a=tueに相当する.
また、列挙要素は文字定数でも文字列定数でもないので、単、二重引用符を付けないでください.
//    VS     ,            
// GCC       ,   
main(){
    enum body
    { a,b,c,d } month[31],j;
    int i;
    j=a;
    for(i=1;i<=30;i++){
      month[i]=j;
      j++;            // VS   
      if (j>d) j=a;
    }
    for(i=1;i<=30;i++){
      switch(month[i])
      {
        case a:printf(" %2d  %c/t",i,'a'); break;
        case b:printf(" %2d  %c/t",i,'b'); break;
        case c:printf(" %2d  %c/t",i,'c'); break;
        case d:printf(" %2d  %c/t",i,'d'); break;
        default:break;
      }
    }
    printf("/n");
}

VSでコンパイルするには、次のコードを見てください.
enum body
	{ a,b,c,d } month[31],j;
	int i;
	j=a;
	for(i=1;i<=30;i++)
	{
		month[i]=j;
		j = (enum body)(j + 1); //      ,     
		if (j>d) j=a;
	}
	for(i=1;i<=30;i++)
	{
		switch(month[i])
		{
		case a:printf(" %2d  %c/t",i,'a'); break;
		case b:printf(" %2d  %c/t",i,'b'); break;
		case c:printf(" %2d  %c/t",i,'c'); break;
		case d:printf(" %2d  %c/t",i,'d'); break;
		default:break;
		}
	}
    printf("/n");