ifを理解する
if文はboolean条件がtrueのときに処理を実行します。波括弧で囲む範囲、elseとの対応、条件式の型を確認し、どの文が実際に実行されるか追います。
この単元で学ぶこと
- ifの条件と実行範囲を判断する
- elseの対応と分岐順を追う
- 条件の型と分岐後の変数を判定する
本文解説
条件で一文を選ぶ int n=3;if(n>0){System.out.print("positive");}では比較がtrueなので表示します。nが0なら表示を行わず次の文へ進みます。ifは条件が成立する間の繰返しではなく、到達した時点で一回だけ条件を調べる分岐です。
条件に使える型 ifの括弧にはbooleanの式を置きます。if(1)はtrue扱いされずコンパイルエラーです。Booleanのtrueもアンボクシングで使えますが、Boolean b=null;if(b)はNullPointerExceptionです。型検査に通ることと実行時に安全なことは別です。
波括弧の役割 if(ok){a++;b++;}では二つの文が対象です。if(ok)a++;b++;ではa++だけがifの対象で、b++は条件に関係なく実行されます。改行や字下げを増やしても対象範囲は広がりません。複数処理は明示的にブロックへ入れます。
空文の落とし穴 if(ok);System.out.print("x");ではifの対象が空文です。表示文は条件の外なのでokがfalseでも実行します。if(ok);{...}でも後のブロックは独立です。条件が正しいのに実行される場合、セミコロンの位置を確認します。
条件内の代入 boolean ok=false;if(ok=true){...}は代入式のtrueを条件にして実行します。if(ok==true)なら比較でありokを変更しません。int n=0;if(n=1)は代入式の型intが条件に合わず拒否されます。=の誤記がすべてコンパイルで見つかるわけではありません。
短絡と安全検査 String s=null;if(s!=null&&s.length()>0){...}は右を省略して本体を飛ばします。s.length()>0&&s!=nullの順では先にnullを参照解除します。if自体にnullを自動回避する機能があるのではなく、条件式の短絡が保護しています。
分岐後の変数 int n=0;if(true){n=4;}System.out.print(n);は4です。外で宣言した変数への代入は分岐後にも残ります。一方if(true){int n=4;}のnはブロック内だけの変数です。値の寿命を考える前に、名前を参照できるスコープを確認します。
実行しない枝も型検査する if(false){int n="x";}は本体を実行しなくても型不一致でコンパイルできません。一方if(false){System.out.print("x");}はコンパイルできて表示しません。Javaにはifの到達可能性に特別な扱いがあるため、while(false)本体と同一視しないようにします。
図解
重要ポイント
- 条件はbooleanまたはBoolean。
- 波括弧なしでは直後の一文だけが対象。
- elseは対応可能な最も近いifへ結び付く。
- 選ばれた枝だけを実行し、通常は分岐後へ合流する。
間違えやすい点
- ifの直後へ余計なセミコロンを書かない。
- インデントだけで制御範囲を判断しない。
- 条件として整数を使えると思わない。
用語解説
- 条件分岐
- 条件の真偽により実行する経路を選ぶ構文。
- ブロック
- 波括弧で複数の文を一まとまりにしたもの。
- 空文
- セミコロンだけで表す、何もしない文。
関連教材
参考資料
教材データに登録された参考リンクです。リンク先の内容や更新日は提供元でご確認ください。
確認問題の出題・採点や学習履歴の保存にはログインが必要です。