列挙体
間違っている場所あったら優しく教えてね
列挙体
列挙体とは
使いたい文字群をラベルするときに使う.列挙体のそれぞれの要素(変数)はメンバと呼ばれます.それぞれに整数型の添字が振り当てられます.
列挙体の本質は整数に名前をつける
例えば天気を表したいときにint型で何番がどの天気と書いておけば変数として持つことはできる. しかし今日の天気は2
お言われたときに雨だと判断することは難しい
// 0:晴れ,1:曇り,2:雨,3:雪 int weather = 2; if(weather == 2){ puts("傘を持っていきましょう"); }
このときに便利なのは 列挙体である.冒頭で呟いたように文字群のラベルとして扱う.
enum < タグ名 > { 要素0 , 要素1 , 要素2 , ... }; enum Weather { Sunny , Cloudy , Rainy } ;
定義の仕方が独特です.これまでの変数だったら初期化時に=
を用いて初期化していました.int i = 0;
今回初期化するといいうよりは定義する方に近いです.
enum hoge型
上の例で見ると,Weather型を作っているように見えますが,実際はenum Weather型です.本質はやっぱりint型を表しています.
enumの定義は#defineと同様にコンパイル時に展開されます そのためメモリに保存されることはありません
イメージとしては#defineの拡張版です.
enumの存在範囲
enum Animal { dog , cat }; void Hello (){ enum Color { red , blue }; enum Animal pet1 = dog; } int Main ( void ){ enum Animal pet2 = cat ; enum Color c = red; // エラーが発生する }
存在範囲はブロック単位でした. enum Color型の列挙体はHelllo 関数内でした用いることができませんでした.
int main( void ){ int a = 0; if(a == 0){ enum Animal { dog , cat }; enum Animal pet1 = dog ; } enum Animal pet2 = cat; // エラーがでる. }
今回のenum Animal 型はif文内のブロック内でしか参照することができないためifの外に外れたpet2の宣言時にはエラーが出ます.
size
enum Animal { dog , cat }; int main(void){ enum Animal pet1 = dog; printf("sizeof(pet1) = %d\n", sizeof(pet1)); // 出力は sizeof(pet1) = 4 }
4が表しているものは整数型のサイズです. 列挙体は整数型のマクロなので整数型のサイズが返されます.
宣言の仕方
enum Animal { dog , cat }; enum Animal { dog , cat } pet1; enum Animal { dog , cat } pet1 = dog; enum { dog , cat } pet1 = dog;
宣言の仕方は以上の3通りがある . 他にもtypeof
を使った宣言があるようだがまだtypeofはわからないので飛ばしておく.