elseを理解する
if文はboolean条件がtrueのときに処理を実行します。波括弧で囲む範囲、elseとの対応、条件式の型を確認し、どの文が実際に実行されるか追います。
この単元で学ぶこと
- ifの条件と実行範囲を判断する
- elseの対応と分岐順を追う
- 条件の型と分岐後の変数を判定する
本文解説
二つの経路を選ぶ if(n>=0){System.out.print("nonnegative");}else{System.out.print("negative");}は条件trueなら前、falseなら後だけを実行します。通常完了した後は両経路とも分岐の次の文へ合流します。elseは独立して条件を持たず、対応するifの残りの経路を担当します。
else ifは段階的な判定 if(n>0){...}else if(n==0){...}else{...}は正、0、負を選べます。上から調べ、最初に成立した枝だけを実行します。else ifという一つの予約語があるわけではなく、elseの文として次のifが入る構造です。
条件の並び順 点数90以上A、60以上Bなら、90以上を先に置きます。if(score>=60){B}else if(score>=90){A}では95も最初のBになり、Aへ到達しません。条件が重なるときは、狭い条件を先にするか境界を明示して重複を避けます。
最も近いifへ対応する if(a)if(b)print("X");else print("Y");のelseは内側のif(b)に結び付きます。a=falseなら内側全体を実行せずYも出ません。外側へelseを付けたい場合は内側のifを波括弧で囲み、その閉じ括弧の後へelseを書きます。
elseの前に別の文を挟めない if(a)print("X");print("M");else print("Y");は不正です。elseの直前には対応するif文の構造が必要で、間の独立した文により結び付けられません。表示やログを両方行いたいならブロックへまとめます。
両枝での初期化 int n;if(flag){n=1;}else{n=2;}ならどちらを選んでもnに値が入るため、後でnを読めます。片側でreturnする場合も、読取りへ到達する経路で代入されていれば合法です。全枝に同じ代入文が必要という規則ではありません。
実行しない枝の式 int d=0;if(d==0){print("zero");}else{print(10/d);}では0除算を実行しません。if/elseは選ばれた枝だけを評価します。ただし型不一致の文があれば、選ばれない枝もコンパイル時に検査されます。
独立したifとの違い int n=1;if(n>0){n=0;}if(n==0){n=2;}は両方の条件を順に評価してnは2です。二番目をelse ifへすると最初の枝を選んだ時点で後は調べずnは0です。状態を変更する分岐では構造の違いが出力へ表れます。
図解
重要ポイント
- 条件はbooleanまたはBoolean。
- 波括弧なしでは直後の一文だけが対象。
- elseは対応可能な最も近いifへ結び付く。
- 選ばれた枝だけを実行し、通常は分岐後へ合流する。
間違えやすい点
- ifの直後へ余計なセミコロンを書かない。
- インデントだけで制御範囲を判断しない。
- 条件として整数を使えると思わない。
用語解説
- 条件分岐
- 条件の真偽により実行する経路を選ぶ構文。
- ブロック
- 波括弧で複数の文を一まとまりにしたもの。
- 空文
- セミコロンだけで表す、何もしない文。
関連教材
参考資料
教材データに登録された参考リンクです。リンク先の内容や更新日は提供元でご確認ください。
確認問題の出題・採点や学習履歴の保存にはログインが必要です。