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コース条件によって値を選びたい

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

この記事では、指定内容に沿って Sample7.java と Sample8.java のみを使い、&&、||、! の基本、if文の中での使い方、条件演算子 ?: の考え方まで、鬼滅の刃風の世界観にたとえながら整理します。

鬼滅の刃風にたとえると、論理演算子は「複数の任務条件を組み合わせる判断札」です。
敵が近い、しかも体力が残っているなら攻撃する。
任務札が A または a なら受付を開始する。
特定の条件ではないなら別の指令に進む。
こうした複雑な判断を、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 である、または特別許可札を持っているなら門を通れる」というような判断です。
どちらか一方を満たせば進めます。

! は条件を反転する

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

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ではない」になります。

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

いくつか具体例を見てみましょう。

条件式意味
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 && false

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

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

a == 6 || a >= 12

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

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

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

!(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);   // 入力された文字列の先頭の1文字を取り出す

        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 と書かれていても、同じ「受付開始」の指令として扱うイメージです。

実行例

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を入力してください。

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

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

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

&& の場合

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

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

false && 右側の条件

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

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

|| の場合

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

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

true || 右側の条件

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

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

このしくみは、最初は少し細かく感じるかもしれません。
まずは、次のように覚えると分かりやすいです。

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

鬼滅の刃風にたとえると、&& は「1つ目の必須条件が失敗したら、次を見るまでもなく任務不可」です。
|| は「1つ目の条件で合格なら、次を見るまでもなく任務許可」です。

& と | との違い

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

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

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

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

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

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

↓クリックすると拡大表示されます。

! を使うときの見方

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

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

順番読み方
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つの条件がそろったときだけ発動する連携技」、|| は「どちらかの条件を満たせば発動する予備作戦」、! は「条件を反転して別の判断に変える札」です。

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