プログラムは、この条件判定が出来て初めて自動化処理が出来ると言っても過言ではありません。人間が判断する事の肩代わりを行う条件判定は、いくつか種類がありますが、今回はその中でも基本中の基本 if 命令を学んでいきましょう。
--
いきなりここに飛んで来ちゃった人は、よろしければ下記からご覧ください。
C言語基礎講座インデックス


  • if もし ~ ならば

例えば、数値が 8 で割り切れる場合に、特別な処理を入れたいとします。8 で割り切れるかどうかは、8 で割った余りが 0 かどうかで判定する事になります。この判断部分を実現するのが if 命令となります。

基本的な文法は下記の通りです。

if (条件式) { // 条件が揃った時に実行する場所 }

{ } で囲まれた場所をスコープと呼びます。このスコープ内は条件式が成立した時だけ実行する専用の場所になります。当然、複数の行を書く事が出来ますし、その中にさらに if を記述する事も出来ます。

この条件式には、同一、非同一、大なり小なりの大きさの比較、論理条件式等、C 言語はかなり多彩な条件式があります。この条件式を表す記号は演算子と呼んでいます。主な条件式を一覧にしてみます。
演算子記述例動作説明
==a == ba と b は等しいか
!=a != ba と b は異なるか
>a > ba は b より大きいか
>=a >= ba は b 以上か
<a < ba は b より小さいか
<=a <= ba は b 以下か


例えば、先ほどの 8 で割り切れるかどうかを記述すると…

int num = 32; if (num % 8 == 0) { printf("%dは8で割り切れる。\n", num); }

こんな書き方になります。演算子の説明で終わる C 言語の説明が多いのですが、大事なのは、その条件式をどう指定するかという書き方です。例えば、今度はその数値が奇数だったらという判定をしたい時に、どう書けば良いのか思いつくでしょうか。これは下記のようになりますが…

int num = 32; if (num % 2 != 0) { printf("%dは奇数です。\n", num); }

もう少し複雑な例をだします。enmyX, enmyY 座標で、範囲が enmyW, enmyH の時に、座標 atkX, atkY がその範囲にあるかどうかってのを、上記の情報だけからパッと書けるでしょうか。おそらくここがプログラミングに慣れるかどうかの最初の関門だと思います。上記の説明の範囲でコーディングすると以下のようなプログラムになるかと思います。

// 当たり判定サンプル int enmyX = 10; // 敵の座標 int enmyY = 12; int enmyW = 3; // 敵の大きさ int enmyH = 2; int atkX = 11; // 弾の位置 int atkY = 12; if (enmyX <= atkX) // 弾のX座標が敵のX座標以上 { int enmyR = enmyX + enmyW; // 敵の右端座標 if (atkX < enmyR) // 弾のX座標が敵の右端より小さい { if (enmyY <= atkY) // 弾のY座標が敵のY座標以上 { int enmyB = enmyY + enmyH; // 敵の下端座標 if (atkY < enmyB) // 弾のY座標が敵の下端より小さい { printf("撃墜!\n"); // 当たり! } } } }


こんな感じで、判定したい処理のコードをスパッと出せるようになるかどうかが、プログラマとして大事な部分になっていきます。文法を覚えただけでそれは分かったけど、どうすれば良いか分からないという人が多く、この部分で躓く人が本当に多いのです。
※ 地震や水害などに備えて非常食は如何でしょうか。5年保つので、都度買い換えれば無駄もないですね。

  • AND 且つ、OR または

さて、先の当たり判定サンプルは、日本語で一言で表すと、「もし、弾のX座標が敵のX座標以上、且つ、弾のX座標が敵の右端より小さく、且つ、弾のY座標が敵のY座標以上、且つ、弾のY座標が敵の下端より小さいならば、当たり!」という意味になります。この且つに相当する演算子が論理演算子です。

論理演算子は大きく3つあります。
演算子意味記述例動作説明
&& AND a && b a 且つ b ならば
|| OR a || b a または b ならば
! NOT !a a の判定結果を反転


先の当たり判定サンプルは、この論理演算子を使うとこんな書き方になります。

int enmyR = enmyX + enmyW; int enmyB = enmyY + enmyH; if (enmyX <= atkX && atkX < enmyR && enmyY <= atkY && atkY < enmyB) { printf("撃墜!\n"); // 当たり! }

どうでしょうか。たぶんこちらの方が見やすいと思います。ただ、判定するしないに関わらず enmyR と enmyB の計算をしてしまうのが気になりますよね?これは if 命令の中で計算すれば解決します。

if (enmyX <= atkX && atkX < (enmyX + enmyW) && enmyY <= atkY && atkY < (enmyY + enmyH)) { printf("撃墜!\n"); // 当たり! }

この if 命令ですが、左側から順番に判定されていきます。もし、最初の enmyX <= atkX で「違う」と判断されると、その後の判定はスキップされます。つまり無駄な計算はしなくなります。計算式を入れる場合は処理優先度が問題になる事があります。慣れないうちは括弧を付けて記述してください、余分な括弧は VS2022 が指摘して外してくれます。それを続けるとそのうち優先度が理解できるようになります😁

さて、この書き方は欠点として1行が長いですよね。そこでこんな書き方を提案してしまいます。

if (enmyX <= atkX && atkX < (enmyX + enmyW) && enmyY <= atkY && atkY < (enmyY + enmyH)) { printf("撃墜!\n"); // 当たり! }

だいぶ見やすくなったと思いますが如何でしょうか?
またはを意味する OR もよく使います。例えば 0 ~ 100 の値があるとして、有効範囲が 20 ~80 だと仮定します。この場合、20未満または80より大きければ有効範囲外になりますよね?これを判定する時に、以下のように記述します。

int num = 95; if (num < 20 || 80 < num) { printf("有効範囲外!\n"); }

否定 NOT は次回で説明します。



  • else じゃなければ
さてさて、上記のサンプルで有効範囲の外か内かを表示したい場合は、今まで覚えた範囲で書くと、こんなコードになります。

int num = 55; if (20 <= num && num <= 80) { printf("有効範囲内!\n"); } if (num < 20 || 80 < num) { printf("有効範囲外!\n"); }

この書き方、私はとても怖いです。怖い理由は、範囲を決めている 20, 80 という数値が判定式の中で複数箇所で記述されているからです。有効範囲を 20 ~ 80 ではなく、25 ~ 75 に変えようと思ったらちょっと手間ですよね?この例だとまだ分かりやすいのですが…。そこで使うのがじゃなければという動作を行う else です。説明より実際に書いた方が早いと思うのでドンッ

int num = 95; if (20 <= num && num <= 80) { printf("有効範囲内!\n"); } else { printf("有効範囲外!\n"); }

判定式が成立したら if 直後のスコープ、非成立なら else 直後のスコープが実行されます。これで範囲変更する時も1箇所直すだけになりますよね。else のスコープ内に if を書く事も出来ます。例えば…

if (20 <= num && num <= 80) { printf("有効範囲内!\n"); } else { if (num == 0) { printf("範囲外最小値!\n"); } if (num == 100) { printf("範囲外最大値!\n"); } if (num != 0 && num != 100) { printf("有効範囲外!\n"); } }

ここでまたしても 0 や 100 等、同じ値で複数箇所で判定しているところが無駄っぽいですよね。ここで使えるのが else if という複合技です。これもいきなりコードをドンッ!

if (20 <= num && num <= 80) // もし範囲内ならば { printf("有効範囲内!\n"); } else if (num == 0) // 0 だったら { printf("範囲外最小値!\n"); } else if (num == 100) // 100 だったら { printf("範囲外最大値!\n"); } else // 全部違うので { printf("有効範囲外!\n"); }
どうでしょうか。組み合わせがかなり多いので、理解は大変だと思います。これは、ある程度数をこなさないとモノに出来ない部分だと思いますので、次々回にまた実力確認テストを行います。自力でいろいろ数値や演算子を変化させて確認してみてください。


  • まとめ
  1. if もし ~ ならば
  2. AND 且つ、OR または
  3. else じゃなければ

>> C言語010 真 TRUE と 偽 FALSE
>> C言語基礎講座インデックスに戻る
※ なるほど!と思ったらAmazonの広告リンクを押して頂けますと嬉しいです!
※ こちらもテレビで紹介。5年保ちます。レトルトなので美味しいです。防災用の備蓄しては如何でしょうか?