🔀 制御構造
🎯 if文の書き方と条件式の考え方を理解し、条件によって処理を分けられるようになる
朝、家を出る前に空を見ます。「雨が降っていたら、傘を持つ」。降っていなければ、何もしない。この「もしも〜なら」をそのままコードにしたのがif文です。
書き方はこうです。
if (条件式) {
条件が真のときだけ実行される処理
}かっこの中に書くのが条件式です。条件式の結果は「真」か「偽」のどちらかになります。C言語では 0 が偽、0以外はすべて真という約束で、C23ではbool型の true / false をそのまま書けます。
条件式でよく使う比較演算子は6つです。==(等しい)、!=(等しくない)、<(より小さい)、<=(以下)、>(より大きい)、>=(以上)。「以上・以下」は境界の値をふくみ、「より大きい・より小さい」はふくみません。80点を合格にしたいのか、81点からなのか——ここは日本語で声に出して確かめる癖をつけてください。境界の1点ぶんのズレは、テストで最も見つかりにくいバグのひとつです。
動く例を見ましょう。
#include <stdio.h>
int main(void) {
int score = 85;
if (score >= 80) {
printf("合格です\n");
}
printf("判定おわり\n");
return 0;
}実行すると「合格です」「判定おわり」の2行が出ます。score を 70 に変えると「判定おわり」だけになります。if が支配しているのは { } の中だけで、その外は条件に関係なく必ず実行される——ここが最初の勘所です。
🧪 ここはメモリの中身を1ステップずつ追う「メモリビジュアライザ」の場面です(アプリ本体で動きます)。
さて、罠の話です。実は { } は省略できます。省略すると、すぐ次の1文だけが if の対象になります。
#include <stdio.h>
int main(void) {
int score = 70;
if (score >= 80)
printf("合格です\n");
printf("おめでとう\n"); // if とは無関係。いつも実行される
return 0;
}70点なのに「おめでとう」が表示されます。インデントは揃っているのに、コンパイラはそれを見ていないからです。インデントは嘘をつきます。
もうひとつ。if (score >= 80); のように条件のうしろにセミコロンを打つと、そこで if は終わってしまいます。あとに続くブロックは条件と無関係に必ず実行され、しかもコンパイルは通ります。目で見つけるのが難しい部類の事故です。
まとめます。if (条件式) { … } で、条件が真のときだけブロックを実行する。Cでは 0 が偽・0以外が真。そして { } は常に書く。この3つだけで、今日はもう十分です。
if (条件式) { … } は、条件が真のときだけブロックの中を実行する{ } は省略できるが省略しない。if (…); のセミコロンは静かな事故のもと真(true)か偽(false)のどちらかに評価される式のこと。if文やwhile文が「どちらへ進むか」を判断するための材料になる。true/falseで表される真偽値の型(bool)がこの評価結果にあたる。
true(真)かfalse(偽)のどちらかしか入らない型のこと。C23では標準の書き方としてbool・true・falseがそのまま使えるようになった。従来は0と1で真偽を表していたが、C23の書き方の方が意図が伝わりやすい。
+や-、==など、値どうしを計算したり比較したりするための記号のこと。演算子ごとに計算される優先順位があらかじめ決まっている。+ - * / のような算術演算子のほか、比較や論理の演算子も含まれる。
もっと先へ:ポインタ・メモリ・ファイル入出力・セキュアコーディングを含む全26トラックと、段位検定・模試のフルセットは完全版に収録しています。