短絡評価のコードトレース

複数のガード、増分を含む条件、Booleanのnullを組み合わせて、左からどこまで実行されるかを追跡します。括弧による結合の変更と、例外によって評価自体が止まる場合も比較します。

この単元で学ぶこと

  • &&と||の右辺が実行される条件を説明する
  • null・ゼロ除算・配列境界を守る評価順を選ぶ
  • 短絡しない演算子や優先順位との違いを追う

本文解説

三段階のガード int[] a=null;int i=0;boolean ok=a!=null&&i>=0&&i<a.length&&a[i]>0;は最初の条件で止まります。配列があるか、添字が下限以上か、上限未満か、値が条件を満たすかという依存順です。後段は前段が成立した場合だけ意味を持ちます。

ORで異常条件を並べる String s=null;boolean invalid=s==null||s.isEmpty();はtrueです。nullか空のどちらかなら異常、という判定です。ANDで正常条件を並べる場合と、ORで異常条件を並べる場合を比べると、同じガードを異なる目的で表現できます。

後置増分を二段階で追う int x=0;boolean b=x++>0&&++x>0;では左は古い0を比較するのでfalseですが、xへの増分は既に起きています。右は短絡されxは1で終了します。短絡された右辺の副作用と、評価済みの左辺の副作用を混同しません。

結合規則と括弧 a||b&&cはa||(b&&c)であり、(a||b)&&cとは異なります。aがtrueなら前者はcを評価しませんが、後者は左の括弧の結果がtrueなのでcを評価します。括弧は見た目だけでなく、副作用や例外が起きるかを変えることがあります。

複数の短絡を追跡する int n=0;boolean b=false&&++n>0||++n>0;では最初の右辺を飛ばし、AND全体がfalseなので最後の比較へ進みます。最終的にnは1、bはtrueです。式全体を一度に暗算せず、各部分式の値と、その直後の変数値を表にします。

Booleanの左辺も安全とは限らない Boolean b=null;boolean ok=b&&false;は左をbooleanへ取り出す段階で例外です。右にfalseがあって数学的に結果を決められても、Javaの実行順は左からです。一方Boolean.FALSE&&bなら右を飛ばせます。

非短絡演算でも例外は止める &や|が両辺を評価するという説明は、左が正常に評価できる場合です。左が例外で異常終了したら右には進みません。Boolean b=null;boolean ok=b&true;は取り出し時に失敗します。例外を演算結果falseとして扱って計算を続けるわけではありません。

評価と確定代入 int n;boolean b=false&&((n=1)>0);System.out.print(n);はnへの代入が実行されないためコンパイルエラーです。未実行になり得る右辺に初期化を任せると、後で読み出せる保証がありません。boolean結果と別の変数初期化を一式に詰め込む際は、確定代入も確認します。

図解

nullを避けて長さを調べる
s != null && s.length() > 0 の順序を保つ。

重要ポイント

  • &&は左がfalseなら右を評価しない。
  • ||は左がtrueなら右を評価しない。
  • booleanの&と|は通常左右を評価する。
  • 実行されない式も型検査は必要。

間違えやすい点

  • ガードの順序を逆にすると危険な式が先に実行される。
  • 右辺の増分や代入が常に起きると思わない。
  • Booleanがnullなら評価された時点の取り出しで例外となる。

用語解説

短絡評価
結果が確定すると後続のオペランドを評価しないこと。
ガード条件
危険な処理を行う前に必要条件を確認する式。
副作用
式の評価が変数への代入等、周囲の状態を変えること。

関連教材

参考資料

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

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