3秒でわかる
複数の条件を組み合わせて真偽を判定する演算子。かつ・または・でない、を表し、入れ子のif文に頼らず条件を1行で書き分けられます。
もう少し詳しく
どういうものか
論理演算子は、真偽値を組み合わせて別の真偽値を作る演算子です。両方が真のときだけ真になる論理積(かつ)、どちらかが真なら真になる論理和(または)、真偽をひっくり返す否定(でない)の3つが基本です。Python では and or not、JavaScript や Java では && || ! と書きます。
A B A かつ B A または B Aでない
真 真 真 真 偽
真 偽 偽 真 偽
偽 真 偽 真 真
偽 偽 偽 偽 真なぜ必要か
現実の判定条件は、ひとつの比較で済むことがほとんどありません。会員であり、かつ在庫があり、かつ配送地域の対象である、といった複数の条件が同時に成り立つかを見ます。入れ子の if を積み重ねると横に深くなって読めなくなるため、条件そのものを1本の式にまとめます。
具体例
age = 20
has_ticket = True
is_member = False
if age >= 18 and has_ticket:
print("入場できる")
if is_member or age >= 65:
print("割引の対象")
if not has_ticket:
print("チケットを購入してください")
# 短絡評価。左が偽なら右は評価されない
user = <a href="/glossary/none" class="text-primary font-medium underline underline-offset-2 hover:text-primary-dark">None</a>
if user is not None and user["name"] == "田中":
print("該当") # userがNoneでもエラーにならない// 短絡<a href="/glossary/evaluation" class="text-primary font-medium underline underline-offset-2 hover:text-primary-dark">評価</a>を値として使う書き方
const name = input || "名無し"; // inputが空文字なら"名無し"
const label = input ?? "名無し"; // nullとundefinedのときだけ"名無し"
// オプショナルチェーンと組み合わせる
if (user?.profile?.age >= 18 && !user.banned) {
show();
}つまずきやすいところ
日本語の「または」と論理和のずれが最初の壁です。「Aか B のどちらか」と言うとき、日常語では片方だけを指すことが多いのですが、or は両方が真でも真になります。片方だけを真としたいなら排他的論理和が必要です。
数学のような範囲の書き方も間違えやすい点です。if 0 < x < 10 は Python では意図どおり動きますが、JavaScript や Java では左から順に評価されて必ず真になり、条件として機能しません。x > 0 && x < 10 と分けて書きます。
短絡評価は便利な反面、右側に副作用のある処理を置くと実行されたりされなかったりします。if flag and save() のような書き方は、flag が偽のときに保存が走りません。
否定の分配も定番の間違いです。not (a and b) は not a or not b であって、not a and not b ではありません。