Java | 論理演算子(AND・OR・NOT) について

Java Java
スポンサーリンク

Java の論理演算子(&&, ||, !)を初心者向けに段階を追って説明し、実際に手を動かして確認できる例題・練習問題(解答付き)を用意します。

論理演算子とは

プログラムで「条件を組み合わせる」ための記号です。
条件は true(真)か false(偽)になります。論理演算子を使って複数の条件を結び、最終的に truefalse を得ます。

主な3つ:

  • && :AND(かつ) — 両方が true のときだけ true
  • || :OR(または) — どちらか一方(または両方)が true なら true
  • ! :NOT(〜ではない) — true を false に、false を true にする

真理値表(覚えやすいように短く)

A     B       A && B   A || B
true  true    true     true
true  false   false    true
false true    false    true
false false   false    false

!A:
A = true  -> !A = false
A = false -> !A = true

具体例(コードでイメージ)

以下のコードはそのままコピーして実行できます(Java)。

public class LogicExample {
    public static void main(String[] args) {
        int math = 84;
        int sci  = 78;

        // AND: 両方満たすとき
        if (math > 80 && sci > 80) {
            System.out.println("数学と理科、両方80点超え!");
        } else {
            System.out.println("残念、どちらかが80点以下です。");
        }

        // OR: どちらか満たせばOK
        if (math > 80 || sci > 80) {
            System.out.println("どちらか一方は80点超えです。");
        }

        // NOT: 否定
        boolean passed = math >= 60;
        System.out.println("数学合格ではない? -> " + !passed);
    }
}
Java

出力イメージ:

残念、どちらかが80点以下です。
どちらか一方は80点超えです。
数学合格ではない? -> false

重要なポイント:短絡評価(ショートサーキット)

&&||短絡評価を行います。
意味:左側だけで結果が確定する場合、右側は評価(実行)されません。

例:

int x = 3;
if (x > 5 && ++x > 0) {
    // ...
}
System.out.println(x); // -> 3 のまま(++x は実行されない)
Java

左側 x > 5false なので、&& の性質上右側は評価されず x は増えません。

逆に |&(単一の縦棒やアンパサンド)は短絡評価しないので、右側も評価されます。副作用(++など)がある場合は挙動が変わるので注意。


よくあるミス・注意点

  1. === を間違える
    • = は代入(a = 5;
    • == は等価比較(a == 5
  2. &&& の違いを知らない(副作用が無い場合は結果は同じだが評価順が違う)
  3. ! を複数重ねて読みにくくする(!!aa に戻る)
  4. 複雑な条件は括弧 () で読みやすく書く(優先順位のミス防止)
    • 例:if ((a > 0 && b > 0) || c > 0) {...}

便利なテクニック:De Morgan(ド・モルガン)の法則

条件の否定を整理するときに便利:

  • !(A && B)!A || !B
  • !(A || B)!A && !B

使いどころ:if の条件を反転して書くときなどに読みやすくできます。

例:

// 元
if (!(x > 0 && y > 0)) {
    // x または y が 0 以下のとき
}

// De Morgan で
if (x <= 0 || y <= 0) {
    // 同じ意味
}
Java

実践的な例(少し応用)

  1. ユーザー入力で年齢と会員フラグから割引判定:
int age = 20;
boolean isMember = true;

if (age >= 18 && isMember) {
    System.out.println("割引対象です");
}
Java
  1. null チェックとメソッド呼び出し(短絡評価が安全を生むパターン):
String s = null;
if (s != null && s.length() > 0) {
    // s が null のとき length() は呼ばれない -> NullPointerException 回避
}
Java

練習問題

下に問題 → 答え・解説 を付けます。まずは自分で考えてから答えを見ると効果的!

問題1

a = 5, b = 10 のとき、式 a > 3 && b < 20 の結果は?

問題2

次のコードの出力は?

int x = 0;
if (x > 1 || ++x > 0) {
    // do nothing
}
System.out.println(x);
Java

問題3

if (!(a == b)) を De Morgan を使って書き換えると?

問題4

次のどれが true か?(複数可)

  • A: true || false
  • B: false && true
  • C: !false

問題5(実践)

ユーザーが「18歳以上 かつ (学生である または 会員である)」場合にメッセージを出す if 文を書け。


答えと解説

問題1
a > 3 は true(5 > 3)、b < 20 は true(10 < 20)なので true && truetrue

問題2
x = 0x > 1 は false なので || の短絡評価で右側を評価する。右側 ++x > 0++xx が 1 になり 1 > 0 は true。したがって if は true だが重要なのは x の最終値:1

問題3
!(a == b)a != b に等しい(a == b の否定は「等しくない」)。

問題4

  • A: true || false → true
  • B: false && true → false
  • C: !false → true
    したがって A と C が true

問題5(解答)

int age = 19;
boolean isStudent = false;
boolean isMember = true;

if (age >= 18 && (isStudent || isMember)) {
    System.out.println("割引対象です");
}
Java

ポイント:(isStudent || isMember) を括弧で囲んで読みやすくしている。


練習をさらに続けたい人向け(おすすめ)

  • 自分で条件を組み合わせた if 文を書いて System.out.println で真偽を確認する。
  • 副作用(i++++i)を使って短絡評価の挙動を実験してみる。
  • 複雑になったらまず真理値表を手で書いてみる(小さな A, B の組合せで確認)。

最後に — 覚えておくべきチェックリスト

  • === を区別する
  • && / || の短絡評価を意識する(副作用に注意)
  • 複雑な条件は () で明示して読みやすくする
  • ! を使うときは ! ( ... ) で否定の範囲をはっきりさせる
タイトルとURLをコピーしました