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

条件をつなげれば、Javaの判断はもっと賢く、もっと柔軟になる

これまでに、関係演算子を使って条件を作り、if文 や if~else文 などで処理を分岐する方法を学んできました。ここまででもかなり多くのことができるようになっていますが、実際のプログラムでは、ひとつの条件だけでは足りない場面がよくあります。

たとえば、会員であり、なおかつ年齢確認も完了している場合だけ先に進ませたいことがあります。また、Aの条件が成り立つか、またはBの条件が成り立つなら処理したいこともあります。反対に、「この条件ではない」という形で判定したいこともあります。

このように、複数の条件を組み合わせて、もっと細かく判断したいときに使うのが論理演算子です。

論理演算子を使うと、条件と条件をつないで、ひとまとまりの新しい条件を作れます。そして、その新しい条件も最終的には true または false になります。つまり、条件をさらに発展させるための仕組みだと考えるとわかりやすいです。

この節では、&&、||、! という3つの基本的な論理演算子を中心に、意味、評価のしかた、使い方、注意点を順番に見ていきます。さらに、最後に条件演算子 ?: についてもふれながら、条件を使った記述をよりすっきり書く考え方までつなげていきます。

論理演算子とは何か

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

たとえば、

  • 条件Aも条件Bも成り立つときだけ true にしたい
  • 条件Aまたは条件Bのどちらかが成り立てば true にしたい
  • 条件Aが成り立たないときに true にしたい

といった場合に使います。

つまり、論理演算子は true や false を材料にして、さらに true や false を作る演算子です。

たとえば、

(点数 >= 80) && (出席日数 >= 20)

という条件は、

  • 点数が80点以上である
  • 出席日数が20日以上である

この2つが両方とも成り立つときだけ true になります。

このように、論理演算子を使うと、ひとつの条件では表しきれない判断を、Javaの式として書けるようになります。

論理演算子の種類

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

演算子意味
&&左右の条件がどちらも true のとき true
||左右の条件のどちらかが true のとき true
!条件の true と false を反転する

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

&& は「しかも」を表す

&& は、左側の条件と右側の条件がどちらも成り立つ場合だけ true になる演算子です。
日本語でいうと、「しかも」や「かつ」に近い感覚です。

たとえば、

(点数 >= 80) && (提出済み == 1)

という式は、

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

この2つがそろっているときだけ true になります。

どちらか一方でも成り立たなければ、全体は false です。

&& の評価表

左辺右辺全体
falsefalsefalse
falsetruefalse
truefalsefalse
truetruetrue

この表を見ると、両方が true のときだけ全体が true になることがわかりますね。

|| は「または」を表す

|| は、左側か右側のどちらか一方でも true なら、全体が true になる演算子です。
日本語でいうと、「または」に近い意味です。

たとえば、

(会員番号 == 100) || (特別招待 == 1)

という式は、

  • 会員番号が100である
  • または特別招待である

のどちらかが成り立てば true になります。

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

|| の評価表

左辺右辺全体
falsefalsefalse
falsetruetrue
truefalsetrue
truetruetrue

この表から、少なくともどちらかが true なら全体が true になることがわかります。

! は条件を反転する

! は、条件の結果を逆にする演算子です。
true なら false にし、false なら true にします。

たとえば、

!(num == 5)

は、「num が 5 ではない」という意味になります。

もとの

num == 5

が true なら、! をつけた式は false です。
逆に、num == 5 が false なら、! をつけた式は true になります。

! の評価表

右辺全体
falsetrue
truefalse

! は1つの条件だけを対象にするので、&& や || とは少し使い方が違います。ですが、とても便利な演算子です。

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

では、具体的な式を見ながら意味を確認してみましょう。

5 > 3 && 3 == 4
a == 6 || a >= 12
!(a == 6)

それぞれの意味は次のようになります。

条件式意味
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 です。

a == 6 || a >= 12

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

たとえば、a の値ごとに見ると次のようになります。

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

このように、どちらか一方が true なら全体が true になります。

!(a == 6)

これは、a == 6 の結果を反転したものです。
つまり、a が 6 でなければ true です。

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

この図では、2つの条件が || によって結びつけられ、全体として1つの条件になっていることを表しています。

a == 6 は true、a >= 12 は false ですが、|| はどちらか一方が true なら全体を true にするので、最終結果は true になります。

このように、論理演算子は個別の条件を材料にして、より複雑な条件を作るための道具です。

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

論理演算子は、単独で式として使うだけでなく、if文 や if~else文 の条件の中で使うことがとても多いです。

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

if((点数 >= 80) && (提出済み == 1)){
    System.out.println("合格条件を満たしています。");
}

この場合は、

  • 点数が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を入力してください。");
        }
    }
}

Sample7.java のポイント

このプログラムで注目したいのは、次の条件です。

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

これは、「ch が A である、または a である」という意味です。
つまり、大文字の A でも小文字の a でも同じ処理にしたいときに便利です。

同じように、

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

は、「B または b なら true」という意味になります。

このように、|| を使うと、複数の候補のうちどれかに当てはまる場合をひとつの条件で表せます。

Sample7.java の実行例

A を入力した場合

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

b を入力した場合

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

それ以外を入力した場合

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

このように、入力文字に応じて表示内容が切り替わります。

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

Javaの && と || には、少し大切な特徴があります。

&& の場合

&& は、左側が false だった時点で、全体は必ず false になります。
そのため、右側を調べなくても結果が決まります。

たとえば、

(false) && (右側の条件)

は、右側が何であっても false です。
このため、Javaでは左側が false なら右側を評価しないことがあります。

|| の場合

|| は、左側が true だった時点で、全体は必ず true になります。
そのため、右側を調べなくても結果が決まります。

たとえば、

(true) || (右側の条件)

は、右側が何であっても true です。
このため、左側が true なら右側を評価しないことがあります。

このしくみは、最初は難しく感じるかもしれませんが、まずは

  • && は左が false なら右を見なくてもよい
  • || は左が true なら右を見なくてもよい

と覚えておけば大丈夫です。

& と | との違い

Javaには、&& や || に似た記号として & や | もあります。
見た目はよく似ていますが、働きは同じではありません。

&& と || は、必要なときだけ右側を評価します。
一方で、& と | は左右の両方を必ず評価します。

学び始めの段階では、まずは条件の組み合わせに使うものとして、&& と || をしっかり使えるようになることが大切です。日常的な条件分岐では、こちらを使うことが多いです。

! を使うときの見方

! は便利ですが、慣れないうちは少し読みにくく感じることがあります。
そんなときは、「まず中の条件を読む」「そのあとで反転する」と考えるとわかりやすいです。

たとえば、

!(score >= 80)

は、まず

score >= 80
つまり「score が 80 以上である」

を読みます。
そのあと ! で反転するので、

「score が 80 以上ではない」

という意味になります。

このように、! は条件を丸ごとひっくり返す記号だと考えると理解しやすいです。

条件演算子 ?: も知っておこう

ここまでの内容に加えて、かんたんな条件分岐を短く書ける条件演算子というものもあります。

書き方は次のようになります。

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

この演算子は、条件が true なら式1、false なら式2 を選ぶものです。
if~else文 を短く式として書きたいときに使います。

条件演算子のサンプル

元の例をそのまま使わず、別のシンプルな例で見てみましょう。
今回は、入力された番号が 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 + "コースを選択しました。");
    }
}

Sample8.java の見方

この行がポイントです。

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

これは、

  • num == 1 が true なら 'A'
  • false なら 'B'

という意味です。

つまり、if~else文 で書くと次のような内容を、1行で表しています。

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

このように、条件演算子は、かんたんな条件に応じて値を選ぶときに便利です。

この図では、条件演算子が条件に応じてどちらかの値を選ぶ様子を表しています。

num == 1 が true なら 'A' が選ばれ、false なら 'B' が選ばれます。
そして、選ばれたほうの値が変数に代入されます。

条件演算子は、処理そのものを分岐するというより、値を選ぶための分岐だと考えるとわかりやすいです。

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

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

これは通常の条件分岐で使う論理演算子とは少し性格が違います。
この段階では、まず

  • 条件を組み合わせるのが &&、||、!
  • 値を簡単に選ぶのが ?:

という基本をしっかり押さえておくことが大切です。

ビット単位の演算は、数値の内部表現やビット操作を学ぶ場面で扱う内容なので、今は「そういう種類の演算子もある」と知っておけば十分です。

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

最後に、大切な点を整理しておきましょう。

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

論理演算子を使えるようになると、単純な条件だけでなく、「この条件も満たす」「どちらかに当てはまる」「この条件ではない」といった、より実践的な判断が書けるようになります。条件分岐の表現が一段広がる、とても大切な内容なので、まずは &&、||、! の意味をしっかりつかみ、短い式を読み解く練習から慣れていくと理解しやすいです。