数値の内容によって分岐するためには switch 文を使います。
たとえば enum 型は取りうる値が決まっているデータ型ですが、その正体は数値です。 enum 型変数の内容(数値)によって分岐する際に switch 文は力を発揮します。
typedef enum GameMode { Opening, GameMain, GameOver, Ending } GameMode; GameMode current = Opening; switch (current) { case Opening: // オープニングの処理 break; case GameMain: // メインループの処理 break; case GameOver: // ゲームオーバー時の処理 break; case Ending: // エンディングの処理 break; }
switch 文には重要なポイントがふたつあります。
実は switch 文というのはラベルジャンプに他ならないのです。ですので、もし break を書き忘れると後に続く処理も実行されてしまいます。これは当然です。プログラムは上から下へ実行されるからです。
switch (current) { case GameMain: // 痛恨の break 書き忘れ case GameOver: // おいおい current が GameMain の時にここも実行されちゃうぞ!? break; }
しかし、 break の書き忘れが常に間違いかというとそうではなく、この動作を逆に利用して「違うラベルで同じ処理をさせる」ことができます。
switch (current) { case GameStage1: case GameStage2: case GameStage3: // ステージ1~3の場合の処理 break; case GameStage4: case GameStage5: case GameStage6: // ステージ4~6の場合の処理 break; }
また、該当しない場合に default: へジャンプするというのは納得のいく仕様かと思われます。コンピュータを使っているとよく「デフォルト値」とか言うと思いますが、あれです。
switch (current) { case Opening: // オープニングの処理 break; case Ending: // エンディングの処理 break; default: // 該当しない債務不履行な処理(債務不履行=デフォルト) break; }
ちなみに if 文でも同じことができるのですが enum 型と連携しての分岐はイディオム的な部分がありますので覚えておきましょう。
Contributions