Developer

【はじめてのjava】論理演算子の注意点【基本構文編】
2020.12.28
Lv1

【はじめてのjava】論理演算子の注意点【基本構文編】

はじめてのJava

このシリーズでは、初めてJavaやプログラミングを勉強する方向けに、Javaによるプログラミングの基礎を説明していきます。
目標レベルは、Javaの資格試験の一つである「Oracle Certified Java Programmer, Silver」(通称Java Silver)に合格できる程度の知識の習得です。
はじめてJavaやプログラムに触れる方にもできるだけわかりやすい解説を心がけていきます。


基本構文編

基本構文編では、様々なプログラミング言語に存在する制御構文と呼ばれる文法について扱っていきます。
制御構文を利用すると「条件で分岐する処理」や「同じ処理の繰り返し」ができるようになります。

今回は、論理演算子の注意点について解説していきます。

目次


論理演算子の注意点


論理演算子の中でも、「&と&&の動作の違い」と「|と||の動作の違い」については注意が必要です。
それぞれの違いを確認していきましょう


&と&&の違い

&と&&の動作の違いについて説明していきます。
&と&&はどちらもAND演算の役割を持つ演算子と呼ばれ、二つの条件A,Bがともにtrueであるときにtrueを返す演算子です。trueとtrue以外の組み合わせはfalseになります。

以下にAND演算が返す結果の組み合わせを表にまとめたものを記載します。

条件A 条件B A & B
A && B
true true true
true false false
false true false
false false false

&演算子と&&演算子は同じ条件式を与えた場合、返す結果そのものに違いはありません。しかし、動作は少し異なります。

結論から書くと一般的には「A && B」の方が効率的な動作をします。その理由を見ていきましょう。

AND演算の動き方

「A & B」「A && B」という記述をしたとき、プログラムはまず条件式Aの真偽値を判定し、その後で条件式Bの真偽値を判定します。

もしAがfalseだった場合は、Bがtrueでもfalseでも関係なく結果は必ずfalseになります。ということは Aがfalseの場合、Bは確認しなくても結果がfalseで確定 します。

&と&&の違い

&と&&の違いは「条件Aがfalseだった場合に条件Bを確認するかどうか」です。

&の場合、条件Aがfalseの場合も必ず条件Bを確認します。&は無駄が多いことになります。
&&の場合、条件Aがfalseだった場合は条件Bは確認しません。&&の方が効率的な動作になります。

Javaの試験を受ける場合は細かく覚えることをお勧めします。Javaの試験を意識しない場合は「論理演算子は2つ重ねたほうが効率的」と覚えておけば大丈夫です。

サンプルコード

&と&&の違いを確認するサンプルコードです。

public class Sample{
  public static void main(String[] args){
    int x;
    int y;
    x = 10;
    y = 10;
    if(x < 0 & y++ < 0){
      //何もしない
    }
    System.out.println("&の場合");
    System.out.println("x : " + x);
    System.out.println("y : " + y);
    
    System.out.println("--------");
    
    x = 10;
    y = 10;
    if(x < 0 && y++ < 0){
      //何もしない
    }
    System.out.println("&&の場合");
    System.out.println("x : " + x);
    System.out.println("y : " + y);
  }
}

どちらのif文もx < 0 がfalseのため、条件式全体がfalseで確定です。
&の場合はy++ < 0も確認するため、y++が動作しyが11になります。
&&の場合はy++ < 0を確認しないため、y++は動作せずyは10のままです。


|と||の違い

|と||の動作の違いについて説明していきます。
|と||はどちらもOR演算の役割を持つ演算子と呼ばれ、二つの条件A,Bのどちらかがtrueであればtrueを返す演算子です。falseとfalseの組み合わせのときだけfalseになります。

以下にOR演算子が返す結果の組み合わせを表にまとめたものを記載します。

条件A 条件B A | B
A || B
true true true
true false true
false true true
false false false

|、||演算子は同じ条件式を与えた場合、返す結果そのものに違いはありません。しかし、動作は少し異なります。

結論から書くと一般的には「A || B」の方が効率的な動作をします。その理由を見ていきましょう。

OR演算の動き方

「A | B」「A || B」という記述をしたとき、プログラムはまず条件式Aの真偽値を判定し、そのあとで条件Bの真偽値を判定します。

もしAがtrueだった場合は、Bがtrueでもfalseでも関係なく結果は必ずtrueになります。ということは Aがtrueの場合、Bは確認しなくても結果がtrueで確定 します。

|と||の違い

|と||の違いは「条件Aがtrueだった場合に条件Bを確認するかどうか」です。

|の場合は条件Aがtrueの場合も、必ず条件Bを確認します。|は無駄が多いことになります。
||の場合は条件Aがtrueだった場合、条件Bは確認しません。||の方が効率的な動作になります。

Javaの試験を受ける場合は細かく覚えることをお勧めします。Javaの試験を意識しない場合は「論理演算子は2つ重ねたほうが効率的」と覚えておけば大丈夫です。

サンプルコード

|と||の違いを確認するサンプルコードです。

public class Sample{
  public static void main(String[] args){
    int x;
    int y;
    x = 10;
    y = 10;
    if(x > 0 | y++ > 0){
      //何もしない
    }
    System.out.println("|の場合");
    System.out.println("x : " + x);
    System.out.println("y : " + y);
    
    System.out.println("--------");
    
    x = 10;
    y = 10;
    if(x > 0 || y++ > 0){
      //何もしない
    }
    System.out.println("||の場合");
    System.out.println("x : " + x);
    System.out.println("y : " + y);
  }
}

どちらのif文もx > 0 がtrueのため、条件式全体がtrueで確定です
|の場合はy++ > 0も確認するため、y++が動作しyが11になります。
||の場合はy++ > 0を確認しないため、y++は動作せずyは10のままです。


Javaの試験対策

javaの資格試験では、これらの演算子とインクリメントやデクリメントを組み合わせた問題が頻出です。

例えば以下のような問題です。

以下のソースコードをコンパイル・実行した結果を選べ。

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

  if(x-- >= 1 || y++ >=2){
   System.out.print(x);
   System.out.print(y);
  }
 }
}

A.11
B.01
C.12
D.02
E.コードは実行されるが、何も出力されない。
F.コンパイルエラー
G.実行時エラー

解答:B
解説
if文内の条件式は、条件「x >=1」と条件「y++ >=2」という二つの条件についてOR演算「||」で評価する条件式になっています。この条件式に使われている論理演算子は「||」なので、条件「x−− >= 1」の結果がtrueだった場合は条件「y++ >= 2」の評価は行わずにif文内の処理を実行します。
それぞれの条件式について見ていきましょう。
「x−− >= 1」について、デクリメントがxの後ろについているので「x >= 1」についての評価を行った後にxの値から1が引かれます。xの初期値は1が代入されているので、「x >= 1」の結果はtrueを返します。そして、xの値から1が引かれてxの値は0になります。
条件「x−− >= 1」がtrueを返したので条件「y++ >= 2」の評価は行われずにif文内の処理に移行します。「y++ >= 2」の評価は行われないので、インクリメントも実行されずyの値は初期値の1のままif文内の処理が実行されます。
if文内の処理は「xとyの値を出力する」という動作なので、xの値である0とyの値である1を出力している選択肢のBが解答となります。


はじめてのJavaシリーズの記事一覧はこちら
シリーズ全記事一覧
環境構築編
プログラムの作り方編


java 11 の練習問題一覧はこちら