第2章13 if文 条件で実行する処理を分ける・その2@イチからゲーム作りで覚えるC言語

if~else if~else文

イチからゲーム作りで覚えるC言語
連載ページ一覧へ
2章14 if文 条件で実行する処理を分ける・その3
NEXT : 2章14 if文 条件で実行する処理を分ける・その3
2章12 if文 条件で実行する処理を分ける : PREV

この記事でやること

前回はプロジェクト「0090_simpleif1」を新しく作り、if ~ else 文を使う方法をお話ししました。
今回は、新しくプロジェクト「0100_simpleif2」を作り、引き続き、条件によって実行する処理を分ける if ~ else if ~ else 文 についてお話します。

この記事はゆる~くC言語でコンソールゲームを作りながらプログラミングを学ぶための連載記事です。シリーズものですので記事の一覧はこちらを参照してくださいね。

設定された難易度を表示するプログラム

ではではプレイヤーからの文字入力を取り扱うサンプルプログラムを作成してみましょう。
プロジェクト「0100_simpleif2」を新しく用意し、プロジェクトに空の「SimpleIf2.c」を追加し、下のソースコードをコピペして動かしてみましょう。

#include <stdio.h>
int main(void) {
 int muzukasisa = 1;
 if (muzukasisa == 1) {
   printf("難易度で EASY が選択されています。\n");
 }
 else {
  printf("難易度で NORMAL が選択されています。\n");
 }
 printf("が選択されています。\n");
}

コピペなりして、実行してみて下さい。

難易度で NORMAL が選択されています。

こんな結果となります。
今は難易度に NORMAL が選択されている、という結果が表示されました。

if ~ else if ~ else 文の書き方

ではでは、今回のプログラムで使っている重要な if ~ else if ~ else 文 について、どのように使うのかを見ていきましょう。

if ( 条件文1 ) { … 複数の命令文A … }
else if ( 条件文2 ) { … 複数の命令文B … }
else if ( 条件文n ) { … 複数の命令文C … }
else { … 複数の命令文D … }

まず条件文1が整数 0 ( false ) 以外なら「複数の命令文A」を実行、そうでないとき、
次の条件文2が整数 0 ( false ) 以外なら「複数の命令文B」を実行、そうでないとき、
次の条件文n が整数 0 ( false ) 以外なら「複数の命令文n」を実行、そうでないとき、
else {…} の「複数の命令文D」を実行。
します。
複数の条件を上から見ていき、合致するものがあれば、その else if 文の{…命令文…}だけを実行する、という流れです。 else if の条件はいくつでも増やして書くことができます。
ソースコードの形と照らし合わせてみてみましょう。

If ~ else if ~ else 文での条件分岐の流れ

If ~ else if ~ else 文での条件分岐の流れ

こんなルールに従って実行されます。ちょっと複雑なように見えますが、実際に何度か使うと直感的な文で書けることがわかると思います。

ソースコードの処理の流れ

実際にソースコードを追ってみましょう。

 int muzukasisa = 2;
 char* muzukasisa_moji;

3 行目で変数 muzukasisa に整数 2 が代入されています。
4 行目で文字列を代入可能な変数 muzukasisa_moji を使えるように宣言します。
6 行目からが if ~else if~elseの記載となります。

 // 変数 muzukasisa によって処理が分岐する
 if (muzukasisa == 1) {
   muzukasisa_moji = "EASY";
 }
 else if (muzukasisa == 2) {
   muzukasisa_moji = "NORMAL";
 }
 else if (muzukasisa == 3) {
   muzukasisa_moji = "HARD";
 }
 else {
   muzukasisa_moji = "VERY HARD";
 }

7 行目の 「if ( muzukasisa == 1 ) {」について、変数 muzukasisa には 2 が入っていますので、正しくありません。ですので、直後の7~9行目の{・・・}は実行されません。

7 行目が正しくない(0、つまり false)のため、次に近い 10 行目の else if の判定に移ります。10 行目では「else if ( muzukasisa == 2 ) {」で、変数 muzukasisa が 2 と等しいかの比較をしています。これは正しいので、直後の 10行目~12行目の{・・・}が実行されます。

 muzukasisa_moji = "NORMAL";

11行目が実行されることで、あらかじめ 4 行目で宣言していた、文字列を代入できる変数 muzukasisa_moji に文字列 “NORMAL” を代入することができました。

それ以降の行(13行~18行)に書いてある else if { … } else { … }はどうなるでしょうか。if ~ else if ~ else の構造では、合致する条件にあてはまるものが見つかれば、それ以外・それ以降の else if ~ else は実行されません
今回のプログラムで実行される行をハイライトにしてみます。

#include <stdio.h>
int main() {
 int muzukasisa = 2;
 char* muzukasisa_moji;

 // 変数 muzukasisa によって処理が分岐する
 if (muzukasisa == 1) {
   muzukasisa_moji = "EASY";
 }
 else if (muzukasisa == 2) {
   muzukasisa_moji = "NORMAL";
 }
 else if (muzukasisa == 3) {
   muzukasisa_moji = "HARD";
 }
 else {
   muzukasisa_moji = "VERY HARD";
 }
 // 難易度を表示
 printf("難易度で %s が選択されています。\n", muzukasisa_moji);
}

最後の printf 関数で難易度を表示する行は必ず通ることになります。
このソースコードは変数 muzukasisa に代入する数値を変えることで、実行される行を変更することができることがわかります。
いくつか、3 行目で muzukasisa に入れる数値を変えて、結果がどうなるかを確認しましょう。

変数 muzukasisa に代入する数値 変数 muzukasisa_moji に入る難易度
0 “VERY HARD”
1 “EASY”
2 “NORMAL”
3 “HARD”
4 “VERY HARD”
5 “VERY HARD”
-100 “VERY HARD”

こんな感じで、いくつかの条件でプログラムの処理を切り替えてあげることができるようになりました。

あとがき

今回はここまで。おつかれさまでした。
次回は if 文のそのほかの書き方と、比較演算子との組み合わせ例を少しだけお話したいと思います。

イチからゲーム作りで覚えるC言語
連載ページ一覧へ
2章14 if文 条件で実行する処理を分ける・その3
NEXT : 2章14 if文 条件で実行する処理を分ける・その3
2章12 if文 条件で実行する処理を分ける : PREV

非常に参考になったサイトさまや、参考文献など

ページの更新履歴

更新日 更新内容
更新なし