Java超|論理演算子で条件を組み合わせる

条件をつなげると、Javaの判断はもっと鋭くなる。
論理演算子を使えば、「両方そろったら」「どちらかなら」「そうでないなら」を自在に表現できる。

これまでに、関係演算子を使って条件を作り、if文、if~else文、if~else if~else文、switch文などで処理を分ける方法を学んできました。

たとえば、score >= 80 と書けば、score が80以上かどうかを調べられます。
また、num == 1 と書けば、num が1と等しいかどうかを調べられます。

ただし、実際のプログラムでは、1つの条件だけでは足りないことがよくあります。

たとえば、次のような判断です。

判断したいこと条件のイメージ
点数が80点以上で、しかも提出済みである条件Aも条件Bも必要
入力が A または a である条件Aか条件Bのどちらかでよい
num が5ではない条件を反転したい
番号が1ならAコース、それ以外ならBコース条件によって値を選びたい

このように、複数の条件を組み合わせたり、条件の結果を反転したりするときに使うのが論理演算子です。

ドラゴンボール風にたとえると、論理演算子は「複数の作戦条件を組み合わせる判断札」です。

敵が近い、しかも体力が残っているなら攻撃する。
任務札が A または a なら受付を開始する。
特定の条件ではないなら、別の指令に進む。

こうした複雑な判断を、Javaの条件式として表せるようになります。

論理演算子とは何か

論理演算子は、条件どうしを組み合わせて、新しい条件を作るための演算子です。

Javaの条件は、評価されると true または false になります。
論理演算子は、その true や false を材料にして、さらに新しい true または false を作ります。

たとえば、次の条件を見てください。

(score >= 80) && (submitted == 1)

これは、次の2つの条件を組み合わせています。

条件意味
score >= 80score が80以上である
submitted == 1submitted が1と等しい

この2つを && でつなぐと、両方とも true のときだけ、全体が true になります。

つまり、

「点数が80点以上で、しかも提出済みである」

という条件を1つの式として書けます。

ドラゴンボール風にたとえると、これは「修行スコアが80以上で、しかも任務報告も済んでいる場合だけ、次の特別修行へ進める」という判断です。

スコアだけ高くても、報告が未提出なら進めません。
報告済みでも、スコアが足りなければ進めません。
両方そろって、はじめて条件クリアです。

論理演算子の種類

Javaで基本としてよく使う論理演算子は、次の3つです。

演算子意味日本語の感覚
&&左右の条件がどちらも true のとき trueかつ、しかも
||左右の条件のどちらかが true のとき trueまたは
!条件の true / false を反転するではない

この3つを使えるようになると、条件分岐で表せる内容が一気に広がります。

条件式意味
score >= 80 && submitted == 1score が80以上で、しかも提出済み
ch == 'A' || ch == 'a'ch が A または a
!(num == 5)num が5ではない

論理演算子は、条件をただ1つずつ見るだけでなく、複数の条件を組み合わせて判断したいときに使います。

ドラゴンボール風に言えば、単発のスカウター判定ではなく、「戦闘力」「体力」「任務札」「許可状態」などを組み合わせて、より細かい作戦判断をするための道具です。

&& は「しかも」を表す

&& は、左側の条件と右側の条件がどちらも true のときだけ、全体が true になります。

日本語では「かつ」「しかも」に近い意味です。

たとえば、次の条件を見てください。

(score >= 80) && (submitted == 1)

これは、次の2つが両方とも成り立つときだけ true です。

条件内容
score >= 80score が80以上
submitted == 1submitted が1、つまり提出済み

どちらか一方でも false なら、全体は false になります。

左辺右辺全体
falsefalsefalse
falsetruefalse
truefalsefalse
truetruetrue

&& は、とても厳しい条件です。
左右の条件が両方そろって、はじめて true になります。

ドラゴンボール風にたとえると、&& は「戦闘力が十分で、しかも仙豆を持っているなら強敵に挑める」という判断です。

戦闘力だけ高くても、回復手段がなければ危険です。
仙豆を持っていても、戦闘力が足りなければ挑戦できません。
両方そろったときだけ、作戦実行です。

|| は「または」を表す

|| は、左側か右側のどちらか一方でも true なら、全体が true になります。

日本語では「または」に近い意味です。

たとえば、次の条件を見てください。

(memberNo == 100) || (specialInvite == 1)

これは、次のどちらかが成り立てば true になります。

条件内容
memberNo == 100会員番号が100である
specialInvite == 1特別招待である

両方とも false のときだけ、全体が false です。

左辺右辺全体
falsefalsefalse
falsetruetrue
truefalsetrue
truetruetrue

|| は、&& よりも条件がゆるいです。
左右のどちらか一方が true なら、全体が true になります。

ドラゴンボール風にたとえると、|| は「任務札がAである、または特別許可札を持っているならゲートを通れる」という判断です。

任務札Aを持っていれば通れます。
任務札Aがなくても、特別許可札があれば通れます。
どちらか一方を満たせばよいのが || です。

! は条件を反転する

! は、条件の結果を反転する演算子です。

true は false になり、false は true になります。

たとえば、次の条件を見てください。

!(num == 5)

これは、num == 5 の結果を反転します。

num == 5 は、「num が5と等しい」という意味です。
それに ! を付けると、「num が5ではない」という意味になります。

num の値num == 5!(num == 5)
5truefalse
3falsetrue
10falsetrue

! は、1つの条件を対象にして、その結果をひっくり返します。

元の条件! を付けた結果
falsetrue
truefalse

ドラゴンボール風にたとえると、! は「その条件ではない場合」を見る反転札です。

「任務番号が5である」を反転すると、「任務番号が5ではない」になります。
「体力が0以下である」を反転すると、「まだ戦える状態である」と読める場面もあります。

論理演算子を使った条件の例

具体例を見ていきましょう。

条件式意味
5 > 3 && 3 == 4左右が両方 true のときだけ true
a == 6 || a >= 12a が6、または12以上なら true
!(a == 6)a が6ではないなら true

5 > 3 && 3 == 4

まず、5 > 3 は true です。

一方で、3 == 4 は false です。

つまり、次のようになります。

true && false

&& は、両方が true のときだけ true になります。
今回は右側が false なので、全体は false です。

条件結果
5 > 3true
3 == 4false
true && falsefalse

ドラゴンボール風に言えば、「敵より戦闘力が高い」は true でも、「任務札が一致している」が false なら、作戦は発動しません。
&& は両方そろう必要があります。

a == 6 || a >= 12

この式は、a が6であるか、または12以上であれば true になります。

a の値a == 6a >= 12全体
6truefalsetrue
5falsefalsefalse
12falsetruetrue
20falsetruetrue

|| は、どちらか一方でも true なら全体が true になります。

ドラゴンボール風にたとえると、「任務番号が6である、または12以上の上級任務であるなら、特別確認へ進む」という判断です。

!(a == 6)

これは、a == 6 の結果を反転する条件です。

a の値a == 6!(a == 6)
6truefalse
3falsetrue
10falsetrue

a が6なら、a == 6 は true です。
しかし ! によって反転されるため、!(a == 6) は false になります。

a が6以外なら、a == 6 は false です。
それが反転されて、!(a == 6) は true になります。

図:|| はどちらか一方が true なら true

この図が示していること

この図では、a == 6 と a >= 12 という2つの条件を || でつないだときの流れを示しています。

a が6の場合、a == 6 は true になります。
一方で、a >= 12 は false です。

しかし、|| は左右のどちらか一方が true なら全体が true になります。
そのため、true || false の結果は true です。

ここから分かることは、|| を使うと「どちらかの条件を満たせばよい」という条件を作れるということです。

if文の中で論理演算子を使う

論理演算子は、if文や if~else文 の条件の中でよく使います。

たとえば、次のように書けます。

if((score >= 80) && (submitted == 1)){
    System.out.println("合格条件を満たしています。");
}

この条件では、次の2つを調べています。

条件意味
score >= 80score が80以上
submitted == 1submitted が1

&& でつないでいるため、両方が true のときだけ、if文の中が実行されます。

score >= 80submitted == 1if文の中
truetrue実行される
truefalse実行されない
falsetrue実行されない
falsefalse実行されない

このように、論理演算子を使うと、if文の条件をより細かく作れます。

ドラゴンボール風にたとえると、「修行点が80以上で、しかも任務報告済みなら次の任務へ進む」という判断です。
どちらか片方だけでは、次の任務には進めません。

|| を使った分岐を確認する

ここでは、入力された文字が A または a なら受付を開始し、B または b なら受付を終了するプログラムを見ていきます。

ファイル名:Sample7.java

import java.io.*;

class Sample7
{
    public static void main(String[] args) throws IOException
    {
        System.out.println("AまたはBを入力してください。");

        BufferedReader br =
            new BufferedReader(new InputStreamReader(System.in));

        String str = br.readLine();
        char ch = str.charAt(0);

        if(ch == 'A' || ch == 'a'){
            System.out.println("受付を開始します。");
        }
        else if(ch == 'B' || ch == 'b'){
            System.out.println("受付を終了します。");
        }
        else{
            System.out.println("AまたはBを入力してください。");
        }
    }
}

このプログラムで特に大切なのは、次の条件です。

ch == 'A' || ch == 'a'

これは、ch が 'A' である、または ch が 'a' である、という意味です。

つまり、大文字の A でも小文字の a でも、同じ処理を実行できます。

同じように、次の条件も見てください。

ch == 'B' || ch == 'b'

これは、ch が 'B' または 'b' なら true になります。

条件式意味
ch == 'A' || ch == 'a'ch が A または a
ch == 'B' || ch == 'b'ch が B または b

このように、|| を使うと、複数の候補のうちどれかに当てはまる場合を1つの条件として書けます。

ドラゴンボール風にたとえると、任務札に A と書かれていても、a と書かれていても、同じ「受付開始」の指令として扱うイメージです。

Sample7.java の実行例

A を入力した場合です。

AまたはBを入力してください。
A
受付を開始します。

この場合、ch == 'A' が true になります。
そのため、ch == 'A' || ch == 'a' 全体も true です。

b を入力した場合です。

AまたはBを入力してください。
b
受付を終了します。

この場合、最初の条件 ch == 'A' || ch == 'a' は false です。
次に、ch == 'B' || ch == 'b' を調べます。
ch == 'b' が true なので、受付を終了します。 と表示されます。

それ以外を入力した場合です。

AまたはBを入力してください。
x
AまたはBを入力してください。

x は A、a、B、b のどれにも当てはまりません。
そのため、最後の else が実行されます。

入力最初の条件次の条件実行される処理
Atrue調べない受付を開始します。
atrue調べない受付を開始します。
Bfalsetrue受付を終了します。
bfalsetrue受付を終了します。
xfalsefalseAまたはBを入力してください。

ここで注目したいのは、A と a を同じ意味として扱えることです。
|| を使うことで、大文字と小文字のどちらでも同じ処理に進めます。

&& と || は途中で評価を打ち切ることがある

Javaの && と || には、途中で評価を打ち切ることがあるという特徴があります。

これは、条件全体の結果が途中で決まる場合に、残りの条件を評価しないことがあるという意味です。

&& の場合

&& は、左右が両方 true のときだけ true になります。

そのため、左側が false だった時点で、全体は必ず false です。
右側が true でも false でも、結果は変わりません。

false && 右側の条件

この場合、全体は必ず false です。
そのため、Javaでは右側の条件を評価しないことがあります。

左側右側全体右側を見る必要
falsetrueでもfalseでもよいfalseない
true右側しだい右側の結果で決まるある

ドラゴンボール風にたとえると、&& は「1つ目の必須条件が失敗したら、次を見るまでもなく任務不可」です。

たとえば、「戦闘力が足りている && 任務許可がある」という条件で、戦闘力が足りていなければ、その時点で任務不可です。
任務許可を確認しても結果は変わりません。

|| の場合

|| は、左右のどちらか一方が true なら true になります。

そのため、左側が true だった時点で、全体は必ず true です。
右側が true でも false でも、結果は変わりません。

true || 右側の条件

この場合、全体は必ず true です。
そのため、Javaでは右側の条件を評価しないことがあります。

左側右側全体右側を見る必要
truetrueでもfalseでもよいtrueない
false右側しだい右側の結果で決まるある

ドラゴンボール風にたとえると、|| は「1つ目の条件で合格なら、次を見るまでもなく任務許可」です。

たとえば、「任務札Aを持っている || 特別許可札を持っている」という条件で、任務札Aを持っていれば、その時点でゲートを通れます。
特別許可札まで確認する必要はありません。

演算子評価を打ち切れる場面
&&左が false なら、全体は false
||左が true なら、全体は true

& と | との違い

Javaには、&& や || に似た記号として、& や | もあります。

見た目は似ていますが、条件分岐での使われ方には違いがあります。

演算子条件式での特徴
&&必要なときだけ右側を評価する
||必要なときだけ右側を評価する
&左右の両方を評価する
|左右の両方を評価する

&& と || は、条件全体の結果が途中で決まれば、右側を評価しないことがあります。

一方で、& と | は、左右の両方を評価します。

学習のはじめの段階では、条件を組み合わせるときは、まず && と || をしっかり使えるようになることが大切です。

図:&& と || は評価を打ち切ることがある

この図が示していること

この図では、&& と || が途中で評価を打ち切ることがある仕組みを示しています。

&& は、左側が false だった時点で全体が false に決まります。
そのため、右側を評価しなくても結果は変わりません。

|| は、左側が true だった時点で全体が true に決まります。
そのため、右側を評価しなくても結果は変わりません。

ここから分かることは、&& と || は、必要なときだけ右側を確認することがあるということです。

! を使うときの見方

! は便利ですが、慣れないうちは少し読みにくく感じることがあります。

そんなときは、次の順番で読むと分かりやすいです。

順番読み方
1まず中の条件を読む
2その結果を反転する

たとえば、次の条件を見てください。

!(score >= 80)

まず、中の条件を読みます。

score >= 80

これは、score が80以上である、という意味です。

そこに ! が付くので、意味は反転します。

つまり、

「score が80以上ではない」

という意味になります。

score の値score >= 80!(score >= 80)
90truefalse
70falsetrue

! は「条件を丸ごとひっくり返す記号」と考えると、読みやすくなります。

ドラゴンボール風にたとえると、! は「この作戦条件ではない場合」を見る反転スカウターです。

条件演算子 ?: とは

論理演算子とは少し違いますが、条件に応じて値を選ぶための演算子として、条件演算子 ?: があります。

書き方は次の形です。

条件 ? trueのときの式1 : falseのときの式2

これは、条件が true なら式1を選び、false なら式2を選ぶ演算子です。

if~else文を短く式として書きたいときに使えます。

条件の結果選ばれる式
truetrue のときの式1
falsefalse のときの式2

条件演算子は、処理の流れを大きく分けるというより、条件によって値を選ぶために使うと考えると分かりやすいです。

ドラゴンボール風にたとえると、条件演算子は「任務番号によって、Aの札かBの札を選ぶ短い判断札」です。

条件演算子を確認する

ここでは、入力された番号が1ならAコース、それ以外ならBコースにするプログラムを見ていきます。

ファイル名:Sample8.java

import java.io.*;

class Sample8
{
    public static void main(String[] args) throws IOException
    {
        System.out.println("コース番号を入力してください。");
        System.out.println("整数を入力してください。");

        BufferedReader br =
            new BufferedReader(new InputStreamReader(System.in));

        String str = br.readLine();
        int num = Integer.parseInt(str);

        char course = (num == 1) ? 'A' : 'B';

        System.out.println(course + "コースを選択しました。");
    }
}

このプログラムで大切なのは、次の行です。

char course = (num == 1) ? 'A' : 'B';

これは、次のような意味です。

条件選ばれる値
num == 1 が true'A'
num == 1 が false'B'

つまり、num が1なら course に 'A' が入ります。
num が1以外なら course に 'B' が入ります。

if~else文で考えると、次のような内容です。

if(num == 1){
    course = 'A';
}
else{
    course = 'B';
}

条件演算子を使うと、このような「条件によって値を選ぶ処理」を1行で書けます。

図:条件演算子 ?: は条件によって値を選ぶ

この図が示していること

この図では、条件演算子 ?: が、条件の結果によってどちらの値を選ぶかを示しています。

num == 1 が true の場合は、'A' が選ばれます。
num == 1 が false の場合は、'B' が選ばれます。

そして、選ばれた値が course に代入されます。

ここから分かることは、条件演算子は if~else文 のように大きな処理を分けるというより、条件に応じて値を選ぶための演算子だということです。

ビット単位の論理演算子について

Javaには、数値を2進数で見たときの各ビットを対象に演算する、ビット単位の論理演算子もあります。

これは、ここで扱っている条件分岐用の論理演算子とは少し性格が違います。

まずは、次のように整理しておくとよいです。

種類主な用途
&&、||、!条件を組み合わせる
?:条件によって値を選ぶ
&、|、^ などビット単位の演算で使うことがある

ビット単位の演算は、数値の内部表現やビット操作を学ぶときに出てきます。

今の段階では、条件分岐でよく使う &&、||、! をしっかり押さえることが大切です。

論理演算子を読むときのポイント

論理演算子を読むときは、いきなり全体を見ようとせず、1つずつ条件を分けると分かりやすくなります。

たとえば、次の条件です。

ch == 'A' || ch == 'a'

この条件は、次の2つに分けて読めます。

条件意味
ch == 'A'ch が A と等しい
ch == 'a'ch が a と等しい

そして、|| でつながっているので、どちらか一方が true なら全体が true です。

次に、&& の場合です。

score >= 80 && submitted == 1

これは、次の2つに分けて読めます。

条件意味
score >= 80score が80以上
submitted == 1submitted が1

&& でつながっているので、両方が true のときだけ全体が true です。

! の場合は、中の条件を先に読み、最後に反転します。

!(score >= 80)

まず score >= 80 を読みます。
そのあと、! によって意味を反転し、score が80以上ではない、と読みます。

論理演算子を理解するための重要ポイント

論理演算子を学ぶときは、次の点を押さえておくと安心です。

ポイント内容
&&左右が両方 true のときだけ true
||左右のどちらかが true なら true
!条件の結果を反転する
論理演算子条件を組み合わせて、より複雑な条件を作れる
&& と ||必要に応じて右辺の評価を省略することがある
?:かんたんな条件で値を選ぶときに便利
& と |条件式では左右を必ず評価する点が異なる

特に最初にしっかり覚えたいのは、次の3つです。

演算子読み方の感覚
&&両方そろったら true
||どちらか一方でも true
!true と false を反転

ドラゴンボール風にたとえると、&& は「2つの条件がそろったときだけ発動する連携技」、|| は「どちらかの条件を満たせば発動する予備作戦」、! は「条件を反転して別の判断に変える札」です。

論理演算子を使えるようになると、単純な条件だけでなく、「この条件も満たす」「どちらかに当てはまる」「この条件ではない」といった、より実践的な判断が書けるようになります。
条件分岐の表現が一段広がる、とても大切な内容です。