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

体力の表記分岐if~else if~else

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

この記事でやること

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

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

現在の体力に応じたステータスを表示するプログラム

ではでは現在の体力に応じてことなるメッセージをだすようなサンプルプログラムを作成してみましょう。
プロジェクト「0110_simpleif3」を新しく用意し、プロジェクトに空の「SimpleIf3.c」を追加し、下のソースコードをコピペして動かしてみましょう。

#include <stdio.h>
int main() {
 int hp = 0;      // 現在のHPを設定
 int maxhp = 9;   // 最大HPを設定
 printf("ぷらんくの体力は %d / %d で", hp, maxhp);
 if (hp == maxhp ) printf("元気いっぱい!\n");
 else if (0 < hp && hp < maxhp / 2) printf("危険です!\n");
 else if (hp == 0) printf("で気絶しています・・。\n");
 else printf("バグってます!?");

 if ( hp == 0 ) printf("あなたは動けません!");
}

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

ぷらんくの体力は 1 / 9 で危険です!

こんな結果となります。
ではでは、中身を見ていきましょう。

if文の命令文(statements)の別の書き方

前回お話した if 文と似ていますが、前回あった if 文の後の {…命令文…} にあたる部分の記載がありません。実は if ~ else if ~ else 文の{…命令文…}にあたる部分は、一つの命令文であれば、置き換えることができます。

今回のソースコードを前回お話した、{…命令文…}の形に書き直してみましょう。

#include <stdio.h>
int main() {
 int hp = 0;      // 現在のHPを設定
 int maxhp = 9;   // 最大HPを設定
 printf("ぷらんくの体力は %d / %d で", hp, maxhp);
 if (hp == maxhp ) {
   printf("元気いっぱい!\n");
 }
 else if (0 < hp && hp < maxhp / 2) {
   printf("で危険です!\n");
 }
 else if (hp == 0) {
   printf("で気絶しています・・。\n");
 }
 else {
   printf("バグってます!?");
 }

 if ( hp == 0 ) {
   printf("あなたは動けません!");
 }
}

ちょっとソースコードが長くなっちゃいますが、まったくプログラムとしての動きは同じです。

if (条件文) { 
  命令文;
}

これは、条件文に当てはまる(=条件文が 0(false)以外)とき、{命令文;}を実行するという処理になりますが、下のように書き換えることができます。

if (条件文) 命令文;

if ( 条件文 ) と 命令文 の間に改行が入っていることもよくあるので、こういった書き方があることは知っておく必要があります。

この書き方では if 文の条件に合致するとき実行されるのは、次の「;」が見つかるまでの区間のみであり、命令文は一つだけ書くことができます。
なお、書いている人は、よほど見やすさでメリットのあるシーンでなければ、「if (条件文) {…命令文…} 」の形を使うように心がけています。

else if 、else の命令文部分の別の書き方

if~else if~else の、各条件で実行される命令文についても、{…命令文…}は下のように書くことができます。

if ( 条件文A ) 命令文;
else if ( 条件文B ) 命令文;
else 命令文;

上のソースコードは下と同じ意味となります。

 if ( 条件文A ) 命令文;
if ( 条件文A ) {
  命令文;
} 
else if ( 条件文B ) {
  命令文;
} 
else {
  命令文;
}

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

今回のソースコードをそのまま実行したとき、どの行が実行されるでしょうか。
実行される行をハイライトで表示してみましょう。
※ifの条件文もプログラムはチェックしますが、その行はハイライトはしてないです。

#include <stdio.h>
int main() {
 int hp = 0;      // 現在のHPを設定
 int maxhp = 9;   // 最大HPを設定
 printf("ぷらんくの体力は %d / %d で", hp, maxhp);
 if (hp == maxhp ) printf("元気いっぱい!\n");
 else if (0 < hp && hp < maxhp / 2) printf("危険です!\n");
 else if (hp == 0) printf("で気絶しています・・。\n");
 else printf("バグってます!?");

 if ( hp == 0 ) printf("あなたは動けません!");
}

5行目までは変数(HP、最大HP)の代入と、プレイヤー(ぷらんく)の体力を表示しています。
6行目は hp==maxhp の比較演算をしていますが、 0≠9 なので、条件に合致しませんので、(結果は false となります。 )その後の「元気いっぱい!」表示は実行されません。
7行目は 「0 < hp かつ hp < maxhp /2 」であるかをチェックしていますね。
前にお話ししましたが、記号「&&」は条件の「かつ(AND)」の意味となります。
まず 「0 < hp」 は偽(0=false)となります。
そして、「 hp < maxhp / 2 」は変数の中身を展開し、「0 < 9 / 2 」になります。この式の右辺「 9 / 2 」の答えは 3 となります。(整数同士の計算では小数点以下は切り捨てられます。)ですので、「0 < 9 / 2 」は「 0 < 3」であり、こちらは真(1 = true)となります。

結局、「 0 < hp && hp < maxhp / 2」は「 false && true 」となります。
論理演算の記号「&&」は、左辺と右辺がどちらも true のときのみ、結果が true となりますので、「 false && true 」の結果は「0 (false)」です。7行目の条件には合致しませんので、このelse if 直後の命令は実行されません。
※このあたりの論理演算については前のぺージでお話しました。

8行目の else if 条件で、hp == 0 と比較しています。これは正しいので、結果は「1(true)」であり、直後の「;」までの命令が実行されます。
9行目は無視されます。(8行目のelse ifの条件が合致しているので)
ちなみにですが、9行目は hp が マイナスだったり、maxhp を超えている時に実行されます。試しに変数 hp に代入する値をいじってみるとわかるかと思います。

11行目の if ( hp == 0 ) について、今回は条件に合致しますので、直後の「;」までに書いている、 printf が実行されます。else if や else は後ろについていないので、この場合、もし hp が 0 以外であれば、なにも実行されずに次の行に進むことになります。

if文の書き方・特定の条件の時は何もしない

if 文を「if ( 条件文 ) 命令文 ;」の形で書いたとき、条件が合致するときは、直後の「;」までの命令文を実行する、とお話したかと思います。重要なのは直後「;」まで実行、というところですので、例えば命令文がなくても動きます。

#include <stdio.h>
int main() {
 int mp = 2;      // 現在のMPを設定
 if ( mp < 3 ) ;
 else if ( mp >= 3 ) printf("MPが3以上になりました。\n");
 printf("MPチェック完了。\n");
}

この例だと、MP が 2 に設定されているため、 if ( mp < 3 ) の条件に合致します。
直後の「;」までの命令が実行されますが、命令は何もありませんので、「特になにもせず」
if ~ else if が完了します。
そして、その後の “MPチェック完了。” が表示される流れとなります。

3項演算子を使う

今回登場した if ~ else については、3項演算子を使うことでまとめて書くことができます。例えば、下のプログラム例の4、5行目を3項演算子で書き換えてみます。

#include <stdio.h>
int main() {
 int mp = 4;      // 現在のMPを設定
 int hp = 10;
 if ( mp < 3 ) hp = 10;
 else if ( mp >= 3 ) hp = 20;
 printf("HPは %d です。\n", hp);
}

4,5行目の if~else は下のように書き換えられます。

#include <stdio.h>
int main() {
 int mp = 4;      // 現在のMPを設定
 int hp = ( mp < 3 ) ? 10 : 20;
 printf("HPは %d です。\n", hp);
}

4行目で int hp に代入しようとしている右辺に「?」や「:」といった記号が入っています。

3項目演算子は下のような形式で書くことができます。

 条件 ? 条件が真の時 : 条件が偽の時

ですので、右辺は「 (mp < 3 ) が真のとき、10、偽のとき 20 」という if ~ else の条件と結果を表しています。今回は条件は偽となりますので、 hp に 20 が代入されます。もし、 mp が 3 以上だったら、 hp には 20 が代入される、ということになります。

3項演算子は1行に条件とその結果を書くことができるので、スッキリしますが、多用するととても読みづらくなるので、気を付けてください。
このシリーズでは 3 項演算子は少なめで、基本的には if ~ else 文で書いてこうと思います。

あとがき

今回はここまで。お疲れさまでした。
次回は条件分岐が沢山あるときに使える、 switch 文についてお話したいと思います。

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

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

ページの更新履歴

更新日 更新内容
更新なし