Nodachisoft Nodachi Sword Icon
  
@あまじ✎ 2018年7月9日に更新

第2章14 if文 条件で実行する処理を分ける・その3

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

この記事でやること

前回はプロジェクト「0100_simpleif2」を新しく作り、if ~ else if ~ else 文を使う方法をお話ししました。

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

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

ではでは現在の体力に応じてことなるメッセージをだすようなサンプルプログラムを作成してみましょう。

プロジェクト「0110_simpleif3」を新しく用意し、プロジェクトに空の「SimpleIf3.c」を追加し、下のソースコードをコピペして動かしてみましょう。

 
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("あなたは動けません!");
}

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

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

こんな結果となります。

ではでは、中身を見ていきましょう。

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

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

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

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("あなたは動けません!");
 }
}

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

if文の書き方
if (条件文) { 
  命令文;
}

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

if文の書き方
if (条件文) 命令文;

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

この書き方では if 文の条件に合致するとき実行されるのは、次の「;」が見つかるまでの区間のみであり、命令文は一つだけ書くことができます。

なお、私は、よほど見やすさでメリットのあるシーンでなければ、「if (条件文) {…命令文…} 」の形を使うように心がけています。

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

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

if~elseif~else文の別の書き方
if ( 条件文A ) 命令文;
else if ( 条件文B ) 命令文;
else 命令文;

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

if~elseif~else文の別の書き方
if ( 条件文A ) {
  命令文;
} 
else if ( 条件文B ) {
  命令文;
} 
else {
  命令文;
}

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

今回のソースコードをそのまま実行したとき、どの行が実行されるでしょうか。

下のコードで実行される行をハイライトで表示してみます。

※ifの条件文もプログラムはチェックしますが、その行はハイライトはしてないです。

 
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("あなたは動けません!");
}

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 の後から「;」までの間に命令が何もありませんので、「特になにもせず」if ~ else if が完了します。

そして、その後、printf命令で "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章13 if文 条件で実行する処理を分ける・その2 : PREV
NEXT : 第2章15 switch文 条件で実行する処理を分ける :
 
 
送信しました!

コメント、ありがとうございます。

なんかエラーでした

ごめんなさい。エラーでうまく送信できませんでした。ご迷惑をおかけします。しばらくおいてから再度送信を試していただくか、以下から DM などでご連絡頂ければと思います。

Twitter:@NodachiSoft_jp
お名前:
 
連絡先:
 
メッセージ:
 
戻る
内容の確認!

以下の内容でコメントを送信します。よろしければ、「送信」を押してください。修正する場合は「戻る」を押してください

お名前:
 
連絡先:
 
メッセージ:
 
Roboto からの操作ではないという確認のため確認キーを入れてください。
確認キー=95
戻る
 / 
送信確認へ
コメント欄
コメント送信確認へ

関連ありそうな記事(5件)です!

ゲーム等で使えるつなぎ目のないループするテクスチャ画像の作り方

#ツール#ゲームプログラミング✎ 2021-01-24
ゲームなどで使えるループ画像、パターンテクスチャのツール、手動での作り方をまとめ
広告領域
追従 広告領域
目次
第2章14 if文 条件で実行する処理を分ける・その3
第2章14 if文 条件で実行する処理を分ける・その3
この記事でやること
この記事でやること
現在の体力に応じたステータスを表示するプログラム
現在の体力に応じたステータスを表示するプログラム
if文の命令文(statements)の別の書き方
if文の命令文(statements)の別の書き方
else if 、else の命令文部分の別の書き方
else if 、else の命令文部分の別の書き方
今回のソースコードの処理の流れ
今回のソースコードの処理の流れ
if文の書き方・特定の条件の時は何もしない
if文の書き方・特定の条件の時は何もしない
3項演算子を使う
3項演算子を使う
あとがき
あとがき
非常に参考になったサイトさまや、参考文献など
非常に参考になったサイトさまや、参考文献など
ページの更新履歴
ページの更新履歴
Nodachisoft © 2020