論理演算子
論理演算子 とは
&&||!で複数の真偽値を組み合わせ、条件をひとつの式にまとめよう。本レッスンでは、論理演算子 の基本から実際の使いどころまでを整理し、現場で迷わず使える形に落とし込みます。
論理演算子で「条件を組み合わせる」
プログラムを書いていると「年齢が 18 以上、かつ 国民である」「ログイン中、または 招待リンクから来た」のように、複数の条件を同時に判定したい場面が必ず出てきます。これを 1 本の式で表すための道具が論理演算子です。
Java には大きく分けて 3 つの論理演算子があります。&& (AND)、|| (OR)、! (NOT) の 3 つです。どれも boolean 型 (true / false) を受け取り、boolean 型を返します。これさえ押さえれば、if 文の条件もぐっと書きやすくなります。
論理演算子は
boolean専用の道具です。intやStringには使えません。「真か偽か」というシンプルな世界をつなぐ専用のパーツだと覚えておきましょう。
3 つの論理演算子
3 種類の論理演算子を、まずはひと言ずつ整理します。
&&(AND) — 左右どちらもtrueのときだけ全体がtrue。「かつ」||(OR) — 左右どちらか一方でもtrueなら全体がtrue。「または」!(NOT) —trueをfalseに、falseをtrueにひっくり返す。「でない」
言葉で覚えるより、実際の 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」なので、b が false だと全体は false になります。a || b は「片方でも true なら true」なので、a が true の時点で全体が true に確定します。! は値を反転させるだけのシンプルな演算子です。
真理値表で全パターンを把握する
&& と || のすべての組み合わせを表にまとめると、頭の中が整理されます。
A | B | A && B | A || B |
|---|---|---|---|
true | true | true | true |
true | false | false | true |
false | true | false | true |
false | false | false | false |
表を眺めて気づいてほしいのは、&& が true になるのは 1 行だけ、逆に || が false になるのも 1 行だけ だということです。
「
ANDは厳しい関所、ORは甘い関所」と覚えると忘れません。ANDは全員trueのパスポートを持っていないと通れない、ORは誰か 1 人持っていれば通れる、というイメージです。
Mermaid で見る投票判定フロー
このレッスンの課題、「age が 18 以上、かつ isCitizen が true なら投票できる」を流れ図にしてみます。
この図がそのまま 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 != null が false のとき、右側の name.length() は 実行されない ので NullPointerException を回避できます。もし && ではなく & (ビット演算) を使うと両方が評価されてしまい、null の length() を呼んでクラッシュします。これが && を使う最大のメリットのひとつです。
短絡評価は「無駄を省く高速化」だけでなく、「安全な順番でチェックする」ための仕掛けでもあります。「軽い判定 → 重い判定」「ヌルチェック → 中身の検査」の順で書くのがセオリーです。
よくある間違い
論理演算子のミスは、コンパイラが見逃すパターンが多くて厄介です。代表的な落とし穴を 3 つ紹介します。
&|(ビット演算) と&&||の混同 —&1 個と|1 個は、int用のビット演算子です。booleanにも一応使えますが、短絡評価が効かないので推奨されません。ifの条件には必ず&&||を 2 個重ねて書きましょう!を忘れる / 付け忘れる — 「ログインしていない場合」は!isLoggedInです。isLoggedInのままだと逆の意味になります。日本語の「~でない」を!に翻訳する習慣をつけてください- 優先順位の勘違い —
&&は||よりも優先順位が高いです。a || b && cはa || (b && c)の意味になります。意図したとおりに書きたいときは、迷わずカッコ()で囲みましょう
もうひとつ、== を使うときの勘違いも多いです。a == true と書く人がいますが、a がすでに boolean なら a と書くだけで十分です。!a も同じく、a == false の代わりにスマートに書けます。
条件式が長くなりそうなときは、いったん
boolean canVote = age >= 18 && isCitizen;のように 名前を付けた変数 に分けるとぐっと読みやすくなります。読み手は名前だけで意図がわかるので、if文がぐっとスッキリします。
やってみよう
それでは課題に取り組みます。Solution.canVote(int age, boolean isCitizen) を完成させましょう。
ageが18以上、かつisCitizenがtrueならtrueを返す- それ以外は
falseを返す &&を 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 つができることを確認しましょう。
- 論理演算子 の要点を自分の言葉で説明できる
- このレッスンの最小コード (または操作手順) を見ずに書ける
- 練習問題やクイズで間違えた箇所を読み直して理解した
理解度チェック (30 秒)
Q. 論理演算子 とは何か、1 文で説明してください。
A. 本文の「このレッスンで分かること」または冒頭の説明文を見直し、自分の言葉で要約できれば OK。詰まったら本レッスンの最初の H2 セクションを読み返してみましょう。
関連レッスン
要件
- クラス名は
Solution、メソッド名はcanVoteにすること - 引数は
int ageとboolean isCitizenの 2 つ、戻り値の型はboolean age >= 18とisCitizenを&&で結んで判定すること
入出力例
test-cases.txt
canVote(20, true) → true
canVote(20, false) → false
canVote(17, true) → false
canVote(18, true) → true