if 文の基本

生田 陸人
LuaGate エンジニア / 現役エンジニア
編集 LuaGate編集部

このレッスンで分かること

  • if (条件) { ... } で条件が true のときだけブロックを実行できます
  • 条件式は必ず boolean を返す式 (int は不可)
  • 最小例は if (n > 0) return "positive"; return "not positive";

if 文の基本 とは

条件によって処理を分岐させる if 文の基本形を学び、正の数かどうかを判定するメソッドを実装してみよう。

条件によって処理を変える ─ if 文の世界へ

プログラムは上から下へ順番に実行されるのが基本ですが、それだけだと面白くありません。実際のアプリでは「ログインしていれば画面 A、していなければ画面 B を見せる」「年齢が 18 歳以上なら通す」「在庫があれば購入ボタンを表示する」のように、状況に応じて処理を切り替える必要があります。この「条件によって処理を分岐させる」仕組みが if 文です。

if 文はあらゆるプログラミング言語に存在する、もっとも基本的な制御構文のひとつです。Java だけでなく JavaScript Python C Go でも、文法は少しずつ違っても考え方はまったく同じです。一度ここで身につければ、ほかの言語にもそのまま応用できます。

日常生活でも、私たちは無意識に条件分岐をしています。「雨が降っていたら傘を持っていく」「お腹が空いていたらご飯を食べる」というのも立派な if 文です。プログラミングではこれを、コンピュータが理解できる厳密な書き方で表現していきます。

if 文の基本形

まずは Java での if 文の文法を見てみましょう。形はとてもシンプルです。

Java

if (条件) { 条件が true のときに実行する処理 }

カッコ () の中に 条件式、その後ろの中括弧 {} の中に 実行したい処理 を書きます。条件式が true なら中の処理が実行され、false ならまるごとスキップされます。

実際に短いコードを書いてみましょう。たとえば「age が 18 以上なら大人」と判定する例です。

Java

public class Solution { public static String check(int age) { if (age >= 18) { return "adult"; } return "child"; } }

age が 20 のときは、age >= 18true になるので return "adult"; が実行されてメソッドはそこで終わります。age が 10 のときは条件が false なので { } の中はスキップされ、そのまま return "child"; まで進みます。

演算子意味
==等しい
!=等しくない
>より大きい
<より小さい
>=以上
<=以下

Java の比較演算子は上の表のとおりです。とくに === の違いは超重要なので、これだけは絶対に覚えてください。

中括弧 { } の役割

if 文の後ろにある { } は、「ここからここまでが if のブロックですよ」という範囲を示す印です。Java では {開きブロック}閉じブロック と呼びます。

複数行の処理をまとめて条件付きで実行したいときは、その全部を { } の中に入れます。

Java

if (score >= 80) { System.out.println("合格"); System.out.println("おめでとう"); }

この 2 行はどちらも score >= 80true のときだけ実行されます。{ } がブロックの境界線になっているおかげで、「ここからここまでが if の中身」というのが一目でわかります。

文法上は処理が 1 行だけなら { } を省略して if (age >= 18) return "adult"; のように書くこともできます。ただし省略すると後で行を増やしたときにバグの温床になるので、初心者のうちは必ず { } を書く ことを強くおすすめします。実際、業務のコーディング規約でも「常に { } を書く」と決めている会社がほとんどです。

条件式は boolean を返す

if のカッコの中に書く条件式は、評価すると必ず truefalse のどちらか、つまり boolean 型の値になります。

  • age >= 18 → 年齢が 18 以上か?
  • name.equals("Alice") → 名前が "Alice" か?
  • count == 0 → カウントが 0 か?
  • isLoggedIn → ログインしているか? (もともと boolean の変数)

boolean 以外の値、たとえば int をそのまま条件にすることは Java では できませんif (count) のように整数を入れるとコンパイルエラーになります。C 言語では「0 なら false、それ以外は true」という暗黙のルールがありますが、Java はもっと厳密で、必ず boolean を要求します。

diagram (will load when visible)

図の流れを順序リストで書き直すと、次の通りです。

  1. if 文に到達する
  2. カッコ内の条件式を評価する
  3. 結果が true ならブロックを実行する
  4. 結果が false ならブロックをスキップする
  5. どちらの経路でも、if 文の次の行へ進む

図のように、if 文は「条件をチェックする分岐点」だと考えるとイメージしやすいです。true なら右に進んで処理を実行、false ならそのまま下に流れて次の行へ進みます。

動きを追ってみる

もう少し具体的な例で、変数の値と条件式の関係を追ってみましょう。

Java

int n = 5; if (n > 0) { System.out.println("positive"); } System.out.println("done");

このコードは次のように動きます。

  1. int n = 5; で変数 n5 を代入
  2. if (n > 0)5 > 0 を評価 → true
  3. { } の中の System.out.println("positive"); が実行されて positive が表示される
  4. ブロックを抜けて System.out.println("done"); が実行されて done が表示される

もし n = -3 だったら 2 のところで -3 > 0false になり、ブロック内はスキップされ、done だけが表示されます。if を通り抜けたあとの行は、条件に関係なく必ず実行されることに注意してください。

よくある間違い

if 文には初心者がつまずきやすい落とし穴がいくつかあります。代表的なものを 3 つ紹介します。

  • { } を省略してハマるif (x > 0) return "positive"; のように { } なしで 1 行書いた後、「処理を追加しよう」と 2 行目を足しても、その 2 行目は if の中ではなく外として扱われます。インデントが揃っているのでぱっと見では気づきにくく、デバッグに時間を取られる典型例です
  • if (x = 0) と書いてしまう ─ 代入の = と比較の == の混同です。x = 0 は「x0 を代入する」という意味で、条件式としては成り立ちません。Java では boolean を期待する場所に int の代入結果が来るのでコンパイルエラーになり、最近の言語の中では比較的安全です
  • if (x); と書いてしまうif のカッコの直後にセミコロン ; を置くミスです。これは「条件が true のとき何もしない」という空文として扱われ、その後ろの { }if と無関係なただのブロックになります。文法エラーにならないのでとくに厄介で、コードレビューで指摘されるまで気づかないことすらあります

もうひとつ補足すると、文字列の比較で if (name == "Alice") と書くのも初心者の鉄板ミスです。Java の String 比較は name.equals("Alice") を使います。これは少し先のレッスンで詳しく扱います。

エラーが出たら、まず「=== を間違えていないか」「{ } の対応が取れているか」「if の直後に余計な ; がついていないか」の 3 点を確認するクセをつけましょう。これだけで 9 割のミスは自力で直せます。

この章のポイント

ここまでの要点 if (条件) { ... }、条件式は必ず booleanint を直接渡せない。ブロック {} は省略しない。String の比較は equals を使う (次のレッスン以降で詳述)。

やってみよう

それでは課題に挑戦してみましょう。今回のお題は「isPositive(int n) メソッドを完成させて、n が正の数なら "positive"、それ以外なら "not positive" を返す」ことです。

  1. 右側のエディタを開く
  2. if (n > 0) の中で return "positive"; を書く
  3. ブロックの外で return "not positive"; を書く
  4. 「実行」ボタンを押して、テストが緑になることを確認する

ポイントは「正の数」の定義です。0 は正の数に含まれません。isPositive(0)"not positive" を返す必要があるので、条件は n > 0 であって n >= 0 ではない、というところに気をつけてください。-3 のような負の数も "not positive" に分類されます。

慣れてきたら、n < 0 を条件にして "negative" を返す、n == 0 のときは "zero" を返す、というように分岐を増やして遊んでみるのもおすすめです。次のレッスンで if-elseelse if を学ぶと、この拡張がもっと自然な形で書けるようになります。

よくある質問

Q. if 文と三項演算子はどう使い分けますか?

A. 本格的な処理が複数行になるなら if 文、値を 1 行で決めたいだけなら三項演算子(result = a if cond else b)が読みやすいです。三項演算子をネストすると一気に読みにくくなるため、条件が 3 つ以上なら if-elif-else に戻すのがおすすめです。

Q. 条件式に == ではなく = を書くとどうなりますか?

A. = は代入なので if a = 0 と書くと文法エラー(Python の場合)または常に真(C 系言語の場合)になります。等価判定は必ず == を使い、None かどうかは is None で比較するのが安全です。エディタが警告してくれることが多いので警告は無視しないようにしましょう。

Q. if のあとに else を書かなくても良いですか?

A. else は省略可能です。条件を満たさないときに何もしないなら else を書く必要はありません。ただし「条件外のケースを想定し忘れた」のか「意図的に省いた」のか後から見て分かるよう、コメントで「else は不要 (xxx のため)」と残しておくと将来の自分を助けます。

次のレッスン

次は if-else 文 で、条件によって処理を分岐させる if 文の基本形を学び、正の数かどうかを判定するメソッドを実装してみよう を学びます。

事前確認 — 進む前に次の 3 つができることを確認しましょう。

  1. if の要点を自分の言葉で説明できる
  2. このレッスンの最小コード (または操作手順) を見ずに書ける
  3. 練習問題やクイズで間違えた箇所を読み直して理解した

理解度チェック (30 秒)

Q. if とは何か、1 文で説明してください。

この章のポイント

A. 本文の「このレッスンで分かること」または冒頭の説明文を見直し、自分の言葉で要約できれば OK。詰まったら本レッスンの最初の H2 セクションを読み返してみましょう。

関連レッスン

要件

  1. クラス名は Solution、メソッド名は isPositive、引数は int n 1 つにすること
  2. n0 より大きいときだけ "positive" を返し、それ以外は "not positive" を返すこと
  3. 0 は正の数に含めない (isPositive(0)"not positive" を返す)

入出力例

test-cases.txt

isPositive(5)"positive" isPositive(0)"not positive" isPositive(-3)"not positive" isPositive(100)"positive"

ヒント

main.java
main.java
学習モード

メモ

if 文の基本

⌘S で保存