列挙型(enum)

列挙型(enum)は構造体と同じように自分で作って宣言しないと使えません。 
次の例を実行してみてください。 
enum eWeek{SUN, MON, TUE, WED, THU, FRI, SAT}; //列挙型 eWeek の型宣言

int main(){

	eWeek today; //eWeek型の変数todayを宣言

	today = SUN;

	printf("%d\n",today);

	return 0;
}
eWeek の部分が 列挙型名、{ } の中の SUN や MON が識別子と呼ばれます。
実行すると画面に 0 が表示されました。 today の中には 0 が入っています。
today = SUN; の部分を today = MON; と書き換えて実行してください。 数値は1になっています。
続けて TUE や WED に書き換えると 2 3 となります。
識別子は 左から順に 0,1,2… と数値が割り振られています。
この数値を変えたい場合は 型宣言のときに = を使えば変えることができます。
それ以外の場所で変更することはできません。
enum eWeek{ SUN, MON, TUE = 30, WED, THU, FRI, SAT};
識別子に割り振られる数値は一つ前の識別子に +1 となります。
TUE を 30 にした場合 WED は 31 になり、それ以降も THU は 32 に FRI は 33 に… 
となってしまいます。
識別子の値を変更する場合は注意しましょう。
today = 1; として実行してみてください。 Visual Studio だとこれはエラーになります。
列挙型変数の中に入れることができるのは、あらかじめ用意された識別子だけです。
なので、数値を入れる場合は必ずキャストしましょう
today = (eWeek)1;  // これはエラーにならない
参照する場合は整数型の int と同じように参照することができます。
enum eWeek{ SUN, MON, TUE, WED, THU, FRI, SAT};

int main(){

	eWeek today; //eWeek型のtodayを宣言

	today = WED;

	printf("%d\n",today);

	return 0;
}

列挙型の真価

列挙型は switch と組み合わせることで真価を発揮します。
enum eWeek{ SUN, MON, TUE, WED, THU, FRI, SAT};

int main(){

	eWeek today; //week型のtodayを宣言

	today = WED;

	printf("今日は");

	switch(today){
	case SUN:
		printf("日曜日です。\n");
		break;

	case MON:
		printf("月曜日です。\n");
		break;

	case TUE:
		printf("火曜日です。\n");
		break;

	case WED:
		printf("水曜日です。\n");
		break;

	case THU:
		printf("木曜日です。\n");
		break;

	case FRI:
		printf("金曜日です。\n");
		break;

	case SAT:
		printf("土曜日です。\n");
		break;
	}

	return 0;
}
switch case に enum を使うことで何を書いているプログラムなのかわかりやすくなります。