Java: OR論理演算子の評価条件

以前、OR演算の2つのオペランドが両方評価されるか否かがあやふやだったので以下のコードを以て改めて確認してみます。

public class Sample1 {
  public static void main(String[] args) {
    int i = 5, j = 10, k =15;
    if ((i++ < j) | (k-- > j))
      System.out.println("values of i: " + i + " values of k: " + k);
    if ((i < j) || (--k > j))
      System.out.println("values of k: " + k);
  }
}

実行結果は

values of i: 6 values of k: 14
values of k: 14

となります。
1つめのif文で使われている演算子はビット論理OR演算子で左右の両オペランドを評価します。よって式i++とk–が評価されているため結果はvalues of i: 6 values of k: 14となります。
2つめのif文で使われているのは短絡論理OR演算子で、評価順序は||の左側のオペランドを先ず評価し、それがtrueなら右側は評価せず(ORは片方が真ならもう片方の結果にかかわらず真ですから)、falseなら評価します。よって、if ((i < j) || (--k > j))ではi < jがtrueとなるため--k > jは評価されずkはデクリメントされません。よってkの値は変わらず、上記のような実行結果となります。

シェアする

フォローする