Javaに関する様々な情報をご紹介します。

3条件演算子

Javaに関する様々な情報をご紹介します。

条件演算子

このページでは,Javaで用意されている&&、||などの条件演算子 について説明します。

概要

条件演算子には以下の演算子が用意されています。条件演算子のオペランドにはboolean型の値をとります。

演算子 記入例 説明
&& x && y xとyの両方がtrueの場合にtrueを返す。
|| x || y xとyのいずれかがtrueの場合にtrueを返す。
& x & y xとyの両方がブール型且つ両方ともtrueの場合にtrueを返す。両方の変数が整数型の場合はビットごとのAND演算を行う。
| x | y xとyの両方がブール型且ついずれかがtrueの場合にtrueを返す。両方の変数が整数型の場合はビットごとのOR演算を行う。
^ x ^ y xとyの両方がブール型且つxとyが異なった値の場合にtrueを返す。両方の変数が整数型の場合はビットごとのXOR演算を行う。
! !x xがfalse場合にtrueを返す。

例1 条件演算子の具体的な使用方法を例示します。

public class ExOperator7 {
  public static void main(String[] args) {
    int x = 0;
    int y = 0;

    if ((!(x > 0)) && (!(y > 0))) {   //(1)
      x = 10;
      y = 20;
    }

    if ((x > 15) ^ (y > 15)) {   //(2)
      System.out.println("演算子^は成立します。");
    } else {
      System.out.println("演算子^は不成立です。");
    }
  }
}

解説1

  1. (1)(!(x > 0))と(!(y > 0))の両方がtrueの場合ifブロック内の式が実行されます。x、yのいずれも0より大きくないため(x > 0)、(y > 0)でfalseが返され!演算子により(!(x > 0))と(!(y > 0))の両方でtrueと見なされます。
  2. (2)(x > 15)と(y > 15)のいずれかがtrueの場合ifブロック内の式が実行されます。(x > 15)はfalse、(y > 15)はtrueが返されるためいずれかがtrueが成り立ちます。

実行結果1

D:\JAVA>javac ExOperator7.java 

D:\JAVA>java ExOperator7 
演算子^は成立します。 

D:\JAVA>

&&、||と&、|の違い

&&、||と&、|において演算子が意味するところは同じですが、その振る舞いには明確な違いがあります。& &と&は左オペランドと右オペランドのいずれもがtrueの場合trueを返します。このことは左オペランドがfalseの場合は右オペランドがtrue、falseにかかわらずfalseを返すとも言えます。&&は左オペランドがfalseの場合右オペランドを実行せずにfalseを返します。&は左オペランドがfalseの場合右オペランドを実行した後、falseを返します。 

|| と|は左オペランドと右オペランドのいずれかがtrueの場合、trueを返します。このことは左オペランドがtrueの場合は右オペランドがtrue、 falseにかかわらずtrueが返されるとも言えます。||は左オペランドがtrueの場合、右オペランドを実行せずにtrueを返します。|は左オペランドがtrueの場合、右オペランドを実行した後trueを返します。&&、||と&、|の振る舞いの違いは左オペランドの結果のみで全体の実行結果が判別できる時に右オペランドを実行するかどうかにあります。&&、||演算子はこれらの特性からショートサーキット(短絡する)演算子とも言われています。 

true、falseの判別のみであればどちらの演算子を使用しても実行結果に違いはありませんが、右オペランドに何らかの処理を実行させる場合には振る舞いの違いを意識する必要があります。右オペランドに何らかの処理を実行させる場合の結果の違いを以下に例示します。

例2 右オペランドで何らかの処理を実行させた場合||と|で結果が異なる例を示します。

public class ExOperator8 {
  public static void main(String[] args) {
    int x1 = 5;
    if (x1 > 0 || (x1 *= 10) > 100) {   //(1)
      System.out.println("x1は"+ x1);
    }

    int x2 = 5;
    if (x2 > 0 | (x2 *= 10) > 100) {   //(2)
      System.out.println("x2は" + x2);
    }
  }
}

解説2

  1. (1)||演算子の場合、左オペランドがtrueの場合右オペランドを実行しません。左オペランドがtrueのため、変数x1を10倍すると言う右オペランドの処理が行われずprintln文が実行されます。
  2. (2)|演算子の場合、左オペランドがtrueの場合も右オペランドを実行します。右オペランドの変数x1を10倍すると言う処理を行い、println文を実行します。

実行結果2

D:\JAVA>javac ExOperator8.java 

D:\JAVA>java ExOperator8 
x1は5 
x2は50 

D:\JAVA>

3条件演算子