プログラミング学習日記

プログラミング学習時のメモ帳。

列挙体

間違っている場所あったら優しく教えてね

列挙体

列挙体とは

使いたい文字群をラベルするときに使う.列挙体のそれぞれの要素(変数)はメンバと呼ばれます.それぞれに整数型の添字が振り当てられます.
列挙体の本質は整数に名前をつける
例えば天気を表したいときに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はわからないので飛ばしておく.

参考

http://wisdom.sakura.ne.jp/programming/c/c51.html

ブログを見ていただきありがとうございました