論理演算子

生田 陸人
LuaGate エンジニア / 現役エンジニア
編集 LuaGate編集部

論理演算子 とは

&& || ! で複数の真偽値を組み合わせ、条件をひとつの式にまとめよう。本レッスンでは、論理演算子 の基本から実際の使いどころまでを整理し、現場で迷わず使える形に落とし込みます。

論理演算子で「条件を組み合わせる」

プログラムを書いていると「年齢が 18 以上、かつ 国民である」「ログイン中、または 招待リンクから来た」のように、複数の条件を同時に判定したい場面が必ず出てきます。これを 1 本の式で表すための道具が論理演算子です。

Java には大きく分けて 3 つの論理演算子があります。&& (AND)、|| (OR)、! (NOT) の 3 つです。どれも boolean 型 (true / false) を受け取り、boolean 型を返します。これさえ押さえれば、if 文の条件もぐっと書きやすくなります。

論理演算子は boolean 専用の道具です。intString には使えません。「真か偽か」というシンプルな世界をつなぐ専用のパーツだと覚えておきましょう。

3 つの論理演算子

3 種類の論理演算子を、まずはひと言ずつ整理します。

  • && (AND) — 左右どちらも true のときだけ全体が true。「かつ
  • || (OR) — 左右どちらか一方でも true なら全体が true。「または
  • ! (NOT) — truefalse に、falsetrue にひっくり返す。「でない

言葉で覚えるより、実際の Java コードで動かしたほうが早いです。

Java

public class LogicDemo { public static void main(String[] args) { boolean a = true; boolean b = false; System.out.println(a && b); // false System.out.println(a || b); // true System.out.println(!a); // false System.out.println(!b); // true } }

a && b は「両方 true のときだけ true」なので、bfalse だと全体は false になります。a || b は「片方でも true なら true」なので、atrue の時点で全体が true に確定します。! は値を反転させるだけのシンプルな演算子です。

真理値表で全パターンを把握する

&&|| のすべての組み合わせを表にまとめると、頭の中が整理されます。

ABA && BA || B
truetruetruetrue
truefalsefalsetrue
falsetruefalsetrue
falsefalsefalsefalse

表を眺めて気づいてほしいのは、&&true になるのは 1 行だけ、逆に ||false になるのも 1 行だけ だということです。

AND は厳しい関所、OR は甘い関所」と覚えると忘れません。AND は全員 true のパスポートを持っていないと通れない、OR は誰か 1 人持っていれば通れる、というイメージです。

Mermaid で見る投票判定フロー

このレッスンの課題、「age18 以上、かつ isCitizentrue なら投票できる」を流れ図にしてみます。

diagram (will load when visible)

この図がそのまま age >= 18 && isCitizen という 1 行の式に対応します。&& は「左の関所も右の関所も、両方通った人だけが true のゴールにたどり着ける」というイメージです。

短絡評価 (short-circuit) を知っておこう

Java&&|| には、短絡評価 という賢い仕組みがあります。これは「結果が確定したら、右側はもう見ない」という挙動です。

  • false && x — 左が false の時点で全体は必ず false。だから x は評価されない
  • true || x — 左が true の時点で全体は必ず true。だから x は評価されない

この性質は、ヌルチェックや配列の境界チェックでとても重宝します。

Java

String name = null; if (name != null && name.length() > 0) { System.out.println("名前あり"); }

name != nullfalse のとき、右側の name.length()実行されない ので NullPointerException を回避できます。もし && ではなく & (ビット演算) を使うと両方が評価されてしまい、nulllength() を呼んでクラッシュします。これが && を使う最大のメリットのひとつです。

短絡評価は「無駄を省く高速化」だけでなく、「安全な順番でチェックする」ための仕掛けでもあります。「軽い判定 → 重い判定」「ヌルチェック → 中身の検査」の順で書くのがセオリーです。

よくある間違い

論理演算子のミスは、コンパイラが見逃すパターンが多くて厄介です。代表的な落とし穴を 3 つ紹介します。

  • & | (ビット演算) と && || の混同& 1 個と | 1 個は、int 用のビット演算子です。boolean にも一応使えますが、短絡評価が効かないので推奨されません。if の条件には必ず && || を 2 個重ねて書きましょう
  • ! を忘れる / 付け忘れる — 「ログインしていない場合」は !isLoggedIn です。isLoggedIn のままだと逆の意味になります。日本語の「~でない」を ! に翻訳する習慣をつけてください
  • 優先順位の勘違い&&|| よりも優先順位が高いです。a || b && ca || (b && c) の意味になります。意図したとおりに書きたいときは、迷わずカッコ () で囲みましょう

もうひとつ、== を使うときの勘違いも多いです。a == true と書く人がいますが、a がすでに boolean なら a と書くだけで十分です。!a も同じく、a == false の代わりにスマートに書けます。

条件式が長くなりそうなときは、いったん boolean canVote = age >= 18 && isCitizen; のように 名前を付けた変数 に分けるとぐっと読みやすくなります。読み手は名前だけで意図がわかるので、if 文がぐっとスッキリします。

やってみよう

それでは課題に取り組みます。Solution.canVote(int age, boolean isCitizen) を完成させましょう。

  1. age18 以上、かつ isCitizentrue なら true を返す
  2. それ以外は false を返す
  3. && を 1 回使えば 1 行で書ける

書き方の方針は次のとおりです。

  • まずは return age >= 18 && isCitizen; のシンプルな 1 行を書いてテストしてみる
  • パスしたら、if 文版 (if (age >= 18 && isCitizen) return true; else return false;) や、! を使った逆向きの書き方 (return !(age < 18 || !isCitizen);) も試してみる
  • どの書き方でも true / false の組み合わせが同じになることを真理値表で確認する

論理演算子は、if 文・while 文・三項演算子と組み合わせることで真の力を発揮します。ここで && || ! の感覚を体に染み込ませておくと、後続のレッスンがびっくりするほどスムーズになります。一緒にマスターしていきましょう。

よくある質問

Q. && と || はどんな順序で評価されますか?

A. && は左から評価し、最初に false が出た時点で残りをスキップします(短絡評価)。|| は最初に true が出た時点でスキップします。これを使うと if (obj && obj.value) のように null チェックと値参照を 1 行で書けます。

Q. && / || の戻り値は必ず true / false ですか?

A. Java の && と || は必ず boolean 型(true または false)を返します。Python の and / or はオペランドの値そのものを返すため 0 or 'default' が 'default' になりますが、Java ではこの挙動は起こりません。JavaScript の || も同様にオペランド値を返す点で Java とは異なります。Java では「&&・|| の結果は常に true か false のどちらか」と覚えておきましょう。

Q. not と != はどう違いますか?

A. not は真偽の反転(not True → False)で、!= は不等値の判定です。x != 0 と not (x == 0) は同じ結果ですが、後者は二重否定で読みにくくなるため != を使うのが基本です。条件全体を反転したいときだけ not を使ってください。

次のレッスン

次は 演算子の優先順位 で、&& || ! で複数の真偽値を組み合わせ、条件をひとつの式にまとめよう を学びます。

事前確認 — 進む前に次の 3 つができることを確認しましょう。

  1. 論理演算子 の要点を自分の言葉で説明できる
  2. このレッスンの最小コード (または操作手順) を見ずに書ける
  3. 練習問題やクイズで間違えた箇所を読み直して理解した

理解度チェック (30 秒)

Q. 論理演算子 とは何か、1 文で説明してください。

この章のポイント

A. 本文の「このレッスンで分かること」または冒頭の説明文を見直し、自分の言葉で要約できれば OK。詰まったら本レッスンの最初の H2 セクションを読み返してみましょう。

関連レッスン

要件

  1. クラス名は Solution、メソッド名は canVote にすること
  2. 引数は int ageboolean isCitizen の 2 つ、戻り値の型は boolean
  3. age >= 18isCitizen&& で結んで判定すること

入出力例

test-cases.txt

canVote(20, true)true canVote(20, false)false canVote(17, true)false canVote(18, true)true

ヒント

main.java
main.java
学習モード

メモ

論理演算子

⌘S で保存