if・elseの全体像

条件分岐は、条件の結果によって実行する文を選ぶ仕組みです。Javaのifはbooleanの条件を使います。字下げではなく波括弧と文の構造を読み、境界値と条件の評価順を紙と実行結果で確かめます。コード断片は正しいmainの中に置くものとします。

この単元で学ぶこと

  • ifとelseの対応を文の構造から判断できる
  • 比較・短絡評価・代入の違いを説明できる
  • 境界値と変数の初期化を含むコードを追跡できる

本文解説

条件は真偽値 if(score>=60){System.out.print("pass");}はscoreが60以上のときだけ表示します。>=の結果はbooleanのtrueまたはfalseです。if(1)のように数値をそのまま条件にはできません。Booleanを使う場合はアンボクシングされますが、nullなら実行時に例外になります。まず条件の型が適切かを確認します。

どちらか一方を選ぶ int score=60; if(score>=60){System.out.print("pass");}else{System.out.print("retry");}はpassを表示します。条件が真ならelse側は実行しません。>=を>へ変えると60で結果が変わるため、59・60・61という境界前後を試すと仕様の取り違えを発見できます。

else ifと独立したif if(score>=80){...}else if(score>=60){...}else{...}は上から条件を調べ、最初に真になった枝だけを選びます。80以上も60以上に含まれるので厳しい条件を先に書きます。独立したifを二つ書くと両方が真の場合に両方実行されるため、同じ動作ではありません。

波括弧と一つの文 波括弧がなければifが直接制御するのは直後の一文です。if(false) System.out.print("X"); System.out.print("Y");ではYが表示されます。字下げだけでは二文をまとめられません。if条件の直後に;を書くと空文を制御し、その後のブロックが無条件に実行される場合があります。

elseの結び付き if(a) if(b) System.out.print("X"); else System.out.print("Y");のelseは、対応するelseがない最も近い内側のif(b)に結び付きます。aがfalseなら内側へ入らないので何も表示しません。外側のelseにしたいなら内側全体を波括弧で囲み、対応関係を明示します。

短絡評価で守る String s=null; if(s!=null && s.length()>0){...}では左辺がfalseなので右辺を評価せず、例外は起きません。&&は左がfalse、||は左がtrueなら右を省きます。booleanの&と|は両辺を評価するので置き換えは同じではありません。先にnull確認をする順番にも意味があります。

比較と代入を区別する boolean ready=false; if(ready=true){System.out.print("go");}はコンパイルでき、代入したtrueを条件に使うためgoが出ます。==は比較、=は代入です。int n=0; if(n=1){...}は代入式の型がintなのでコンパイルできません。代入を条件へ書いてしまう誤りは型によって現れ方が違います。

分岐後の値を検証する int result; boolean ok=args.length>0; if(ok){result=1;}else{result=2;} System.out.print(result);は両経路で代入するので読み出せます。elseがなく、falseの経路で未代入ならコンパイルエラーです。条件・選択した枝・更新した変数・表示を表にし、javacで型と初期化、javaで実行結果を分けて確かめます。

図解

分岐は条件と二つの経路
波括弧で分けた経路を追い、実行しなかった枝の代入を数えない。

重要ポイント

  • 条件はbooleanまたはBooleanであり、数値を真偽として扱わない。
  • else ifは最初の真の枝、独立したifはそれぞれ評価する。
  • 波括弧・空文・elseの対応で実行範囲が決まる。
  • 短絡評価では右辺の副作用や例外も省略される。

間違えやすい点

  • 字下げで処理範囲を判断しない。
  • =と==を混同しない。
  • 境界値の等号と、未代入になる経路を確認する。

用語解説

boolean
trueまたはfalseを持つ基本型。if条件に使う。
ブロック
波括弧で複数の文をまとめたもの。
短絡評価
左側の結果だけで決まるとき、右側を評価しない仕組み。
空文
セミコロンだけからなる、処理を行わない文。
確実な代入
ローカル変数が読み出される前に値が代入されることをコンパイラが確認する規則。

関連教材

参考資料

教材データに登録された参考リンクです。リンク先の内容や更新日は提供元でご確認ください。

確認問題の出題・採点や学習履歴の保存にはログインが必要です。