C 列挙型 新しいページはコチラ

提供: yonewiki
移動: 案内, 検索
(ページの作成:「※このページではC言語にも存在していたという意味で記事タイトルがC ポインタになっていますが、<br /> C++でも同...」)
 
(列挙型)
9行: 9行:
  
  
enum 列挙型名{識別子1,…,識別子n};
+
'''enum 列挙型名{識別子1,…,識別子n};'''
  
  
15行: 15行:
  
  
列挙型名 列挙変数名;
+
'''列挙型名 列挙変数名;'''
  
  
45行: 45行:
 
       break;
 
       break;
 
     case ACTION_START:
 
     case ACTION_START:
       printf("ACTION_STOP\n");
+
       printf("ACTION_START\n");
 
       break;
 
       break;
 
     case ACTION_PAUSE:
 
     case ACTION_PAUSE:
       printf("ACTION_STOP\n");
+
       printf("ACTION_PAUSE\n");
 
       break;
 
       break;
 
     case ACTION_RECORD:
 
     case ACTION_RECORD:
       printf("ACTION_STOP\n");
+
       printf("ACTION_RECORD\n");
 
       break;
 
       break;
 
     case ACTION_RESTART:
 
     case ACTION_RESTART:
       printf("ACTION_STOP\n");
+
       printf("ACTION_RESTART\n");
 
       break;
 
       break;
 
     case ACTION_NEXTCHAPTER:
 
     case ACTION_NEXTCHAPTER:
       printf("ACTION_STOP\n");
+
       printf("ACTION_NEXTCHAPTER\n");
 
       break;
 
       break;
 
     case ACTION_PREVCHAPTER:
 
     case ACTION_PREVCHAPTER:
       printf("ACTION_STOP\n");
+
       printf("ACTION_PREVCHAPTER\n");
 
       break;
 
       break;
 
     default:
 
     default:
73行: 73行:
 
ACTION_STOP
 
ACTION_STOP
 
</syntaxhighlight>
 
</syntaxhighlight>
で、列挙型って何?って感じのプログラムかもしれませんが、この程度の使い方でもあるわけでして、なんともシンプルかつ不可解な存在だと言えると思います。
+
で、列挙型って何?って感じのプログラムかもしれませんが、この程度の使い方でもあるわけでして、なんともシンプルかつ不可解な存在だと言えると思います。列挙型で大事なのはサンプルプログラムの17行目の使い方をするところです。
 +
 
 +
 
 +
  '''enumActionSignal = ACTION_STOP;'''
 +
 
 +
 
 +
この一行だけ見ると、なにかを代入しているんだけど、列挙子って奴は変数みたいになっちゃってるんだなって思うかもしれませんが、列挙子1から順番にACTION_STOP = 0という具合に整数が割り当てられていて、次に指定した列挙子2にはACTION_START = 1のような値を保持します。まとめると
 +
 
 +
 
 +
ACTION_STOP    = 0
 +
ACTION_START  = 1
 +
ACTION_PAUSE  = 2
 +
ACTION_RECORD  = 3
 +
ACTION_RESTART = 4
 +
ACTION_NEXTCHAPTER = 5
 +
ACTION_PREVCHAPTER = 6
 +
 
 +
 
 +
という具合に0~6までの順序番号を自分で好きな名前で定義した文字列ACTION_***に割り振ってくれます。これをenumAction型として列挙型というものを宣言して、
 +
 
 +
 
 +
'''enumAction enumActionSignal;'''
 +
 
 +
 
 +
としてenuAction型の変数enumActionSignalを作成しています。これでenumActionSignalは0~6までの整数が割り振られた列挙子を格納するための変数となったことになります。ここではACTION_*****の部分で動作について数字を割り振ったようなサンプルにしましたので、17行目では
 +
 
 +
 
 +
  enumActionSignal = ACTION_STOP;
 +
 
 +
 
 +
あたかも
 +
 
 +
 
 +
  enumActionSignal = 0;
 +
 
 +
 
 +
と代入したかのような動作をしてくれます。と、なんだかありがたそうに書きましたが、それだったらint型でも普通に代入できるじゃんと思うところですが、まったく意味合いは異なります。なにが大事かと言うと、列挙型で定義した変数にはenumActionSignal = 7;に対応する列挙子が用意されていないので、列挙型として定義していない値は代入できないことが重要な部分になっていることです。
 +
 
 +
 
 +
このようなすごく単純な動作ですが、列挙型の重要な働きである不要な値は保持できないという振る舞いがプログラムには大事であり、プログラマにとってはとても利用価値のある存在になっています。それはなぜかというと、関数の動作を変えたり、処理の動作を変えるにはif文やswitch文で数字と比較して、ある番号ならこの処理をするという記述をする際、番号だけをつかっていると、何の処理をするかが覚えにくいからです。ある関数では0はSTOP。ある関数では0はSTART。あるプログラマが作った関数では0は異常終了といった具合に処理の決め手となる数字のフラグの意味がことなるからです。このため、プログラマは列挙型で準備した列挙子に意味のある言葉やワード(単語)を割り当てて、誰が使っても使いやすい関数を作ろうとするのです。
 +
 
 +
 
 +
このことが理解できなければ列挙型の説明を読んでも、なんだか複雑な構文の割には整数型となんら遜色ないし、覚えるだけ無駄なように感じてしまうかもしれません。列挙型は非常に重要な役割をもっていて、とても人気のある構文だという事を忘れないで欲しいです。
 +
 
 +
 
 +
但し列挙型の悪いところは、列挙子を覚える必要があることにもあるし、関数の使い方を列挙子に依存することで、本来はただの整数のやりとりなのに隠ぺいされているがために、逆に整数の0はenumActionSignalという列挙変数ではなんていう名前の列挙子を使えばいいのかがわからないことにあります。人気のある関数の列挙子は覚えやすいし、めったに使わない関数の列挙子は覚えづらいし、ながったらしくて嫌になることもあります。デメリットへの対処法はenumの宣言部分を見るか?enumを使っている関数やクラスの利用説明書を見るか?ネットで調べるか?ということになります。よくできた頭のよいというか親切な関数作成者はenumで使われている列挙子を検索する関数を作っていたりもしますが、その検索関数の使い方がわからないという連鎖があったりするのも、これまたおかしです。わかりやすいと思って列挙子を使っているのが回りまわって時間を浪費してしまうケースもすくなくはありません。
 +
 
 +
 
 +
列挙型の変数はポインタとして扱われることもありますので、そのあたりの応用が必要になることもあります。

2015年2月18日 (水) 00:00時点における版



個人用ツール
名前空間

変種
操作
案内
ツールボックス