概要
実際の条件は「年齢が 18 以上 かつ 会員登録済み」のように、複数の真偽値を組み合わせて判定したい場面がほとんど。これを表現するのが論理演算子で、&& (and: 両方が真) / || (or: どちらかが真) / ! (not: 真偽を反転) の 3 つを覚える。比較演算子で作った $age >= 18 のような小さな条件を、論理演算子で接着して大きな条件を組み立てるイメージ。
論理演算子のもう 1 つの重要な性質が 短絡評価 (short-circuit) だ。A && B は A が偽の時点で結果が偽に確定する ので、PHP は B を評価しない。同じく A || B は A が真の時点で B は評価されない。これを利用して、if ($user !== null && $user->isAdmin()) のように「左でガードしてから右で本処理」と書くと、null 参照エラーを避けられる。逆に「右側に副作用があるコード」を書くと、左の結果次第で実行されたりされなかったりして、思わぬバグになる。
PHP には && || の他に キーワード版 の and or も存在する。一見同じに見えるが、&& と and は 演算子の優先順位が違う。たとえば $a = true && false は $a が false になるが、$a = true and false は $a が true になる (= より and が弱いため代入が先)。歴史的事情で残っているが、現代のコードでは混乱を避けるため && || を使うのが鉄則だ。
学習目標
&&(and) で「両方が真」を判定できる||(or) で「どちらかが真」を判定できる!(not) で真偽を反転できる
ドリル
| no | 内容 |
|---|---|
| 01 | && で「0 以上 かつ 100 以下」を判定 |
| 02 | \|\| で「Sat または Sun」を判定 |
| 03 | ! で「偶数ではない」を判定 |
📝 演習: ドリル 01 — `&&` で範囲判定
問題
標準入力で整数を 1 行受け取り、
0 以上 かつ 100 以下 なら valid を、そうでなければ invalid を出力してください。
入力例:
50
期待される出力:
validヒント
$n = (int) trim(fgets(STDIN));で整数として読むif ($n >= 0 && $n <= 100)で範囲チェックelseでinvalidを出す
📝 演習: ドリル 02 — `||` で週末判定
問題
標準入力で曜日を 1 行受け取ります。値は Mon Tue Wed Thu Fri Sat Sun のいずれかです。
Sat または Sun なら weekend を、そうでなければ weekday を出力してください。
入力例:
Sat
期待される出力:
weekendヒント
$day = trim(fgets(STDIN));で文字列として読むif ($day === "Sat" || $day === "Sun")で or 判定
📝 演習: ドリル 03 — `!` で奇数判定
問題
標準入力で整数を 1 行受け取り、偶数ではない (= 奇数) なら odd を、
そうでなければ even を出力してください。
判定には ! 演算子を必ず使う こと。
つまり「偶数」を表す条件式を作り、それを ! で反転して使います。
入力例:
7
期待される出力:
oddヒント
$n % 2 === 0が「偶数」を表す!($n % 2 === 0)で「偶数ではない」になるif (!($n % 2 === 0)) { ... } else { ... }