論理演算子

広告

関係演算子を使うことで様々な条件を記述することができますが、さらに論理演算子を使うことで「10より大きく かつ 30より小さい」や「x が 10と等しい 又は y が20と等しい」などのように複数の条件式を組み合わせたより複雑な条件式を記述できます。

論理演算子を使った場合も結果として式がboolean型のtrue(真)かfalse(偽)のいずれかとなります。論理演算子として用意されているのは次の通りです。

演算子使用例意味
&&a && ba と b が共にtrueの時にtrue
||a || ba か b の少なくとも1つがtrueの場合にtrue
!!aa がtrueの場合にfalse、a がfalseの場合にtrue

論理演算子の場合には対象となる値がboolean型の値です。これはboolean型の値を指定する場合もありますが、通常は関係演算子を使った条件式などを記述します。

ではそれぞれ確認してみます。

論理積

「&&」は論理積とも呼ばれ、演算子の左辺及び右辺の値が共にtrueの場合だけ全体もtrueとなります。

左辺 && 右辺

左辺と右辺の値による全体の値の一覧は次の通りです。

左辺右辺全体
truetruetrue
truefalsefalse
falsetruefalse
falsefalsefalse

次の例を見てください。

int num = 10;
boolean b;

b = num > 5 && num <= 20;

この場合、まず「num > 5」について判定します。結果はtrueです。次に「num <= 20」を判定します。結果はtrueです。そして&&演算子の両端の値が共にtrueですので式「num > 5 && num <= 20」はtrueとなります。

なお最後に「&&」演算子が判定されるのは「>」演算子や「<=」演算子と比べて優先順位が低いためです。

論理和

「||」は論理和とも呼ばれ、演算子の左辺または右辺の値の少なくとも一つがtrueの場合に全体がtrueとなります。

左辺 || 右辺

左辺と右辺の値による全体の値の一覧は次の通りです。

左辺右辺全体
truetruetrue
truefalsetrue
falsetruetrue
falsefalsefalse

次の例を見てください。

int num1 = 10;
int num2 = 20;
boolean b;

b = num1 > 20 || num2 < 30;

この場合、まず「num1 > 20」について判定します。結果はfalseです。次に「num2 < 30」を判定します。結果はtrueです。そして||演算子の両端の値の少なくとも一つがtrueですので式「num1 > 20 || num2 < 30」はtrueとなります。

なお「&&」演算子と「||」演算子の優先順位は同じではなく「&&」の方が優先順位が高くなっています。次の例を見てください。

int num1 = 30;
int num2 = 10;
boolean b;

b = num1 > 20 || num2 < 30 && num2 > 20;

この場合、先に「num2 < 30 && num2 > 20」が判定されます。これはfalseとなります。次に「num1 > 20 || false」が判定されますので全体としてはtrueとなります。もし先に「num1 > 20 || num2 < 30」から判定された場合は次に「true && num2 > 20」が判定されるため全体としてはfalseとなり本当の結果とは変わってしまいます。

このように論理演算子が複数含まれるような式の場合には優先順位に注意して下さい。

論理否定

「!」は論理否定とも呼ばれ、演算子の右辺の値を反転します。

!右辺

右辺の値による全体の値の一覧は次の通りです。

右辺全体
truefalse
falsetrue

次の例を見てください。

int num = 10;
boolean b;

b = !(num > 20);

この場合、まず「num > 20」について判定します。結果はfalseです。そして!演算子によっての式「!(num > 20)」はtrueとなります。

なお!演算子は優先順位がかなり高いので必要に応じて括弧を使って下さい。

判定される順番

&&演算子や||演算子では左辺及び右辺の値を使って全体の判定を行いますが、どちらの演算子もまず左辺から判定します。

左辺 && 右辺

&&演算子の場合で考えてみると、まず左辺を判定します。ここで左辺がfalseだった場合には全体がfalseと確定するため右辺の判定は行いません。

左辺 || 右辺

||演算子の場合もまず左辺を判定します。ここで左辺がtrueだった場合には全体がtrueと確定するため右辺の判定は行いません。

ここで順番を何故気にするのかと言えば、まず左辺から先に判定されるため左辺と右辺のどちらに何を記述するのかによって処理効率が変わる場合があります。左辺だけで結果が確定する場合が多いようにしておけば、右辺を判定する必要がなく効率的です。

また左辺で結果が確定した場合に右辺は判定されませんので、右辺にインクリメント演算子を含む式が記述されていた場合など式そのものが処理されない場合もあります。次の例を見てください。

int num1 = 30;
int num2 = 25;
boolean b;

b = num1 > 10 || ++num2 < 40;

この場合、||演算子の左辺だけで全体がtrueとなることが確定するため右辺はまったく処理されません。その為変数「num2」の値も1増えることはありません。もしも左辺がfalseだった場合には右辺も判定されるため変数「num2」の値が式を判定後に1だけ増加します。このように論理演算子を使用する場合には注意が必要となります。

サンプル

では簡単なサンプルで試してみます。

JSample12_1.java

class JSample12_1{
  public static void main(String args[]){
    int num = 30;

    System.out.println("num = " + num);

    System.out.print("num > 5 && num < 20  --> ");
    System.out.println(num > 5 && num < 20);

    System.out.print("num > 20 || num < 10  --> ");
    System.out.println(num > 20 || num < 10);

    System.out.print("!(num < 20)  --> ");
    System.out.println(!(num < 20));
  }
}

コンパイル後に実行すると次のように表示されます。

p12-1

( Written by Tatsuo Ikura )

関連記事 (一部広告含む)