はじめに
条件分岐が複雑になって、「自分でも読みにくいな…」と感じたことはありませんか?
特に、否定(!)が絡んだ条件は一気に分かりづらくなりがちです。
「基本情報の勉強でも出てきてなんとなく知っているけど、実務でどう使うのかイメージしづらい」——そんな方に向けて解説します。
この記事では、ド・モルガンの法則の基本と、実務での使いどころを分かりやすく解説します。
ド・モルガンの法則とは
ド・モルガンの法則は、19世紀のイギリスの数学者オーガスタス・ド・モルガンが提唱した、論理式の形を別の形に書き換えるルールです。
基本情報技術者試験でも登場する内容ですが、ポイントはシンプルです。
AND(かつ)をOR(または)に変えるOR(または)をAND(かつ)に変える- 全体の否定(
!)を、それぞれの条件の否定(!)に分ける
式で書くと次のようになります。
!(A && B) → !A || !B
!(A || B) → !A && !B
※ A や B は「何らかの条件」だと思ってください
(例:システムでいうと「ログイン済みである」「管理者である」など)
ベン図でイメージする
ベン図を使うと、直感的に理解しやすくなります。

この図は、「AかつB(重なっている部分)」以外を表しています。
つまり、次の3つの領域が含まれます。
- Aだけに当てはまる
- Bだけに当てはまる
- AかつBに当てはまらない
別の角度から見ると、!A(Aではない領域すべて)と !B(Bではない領域すべて)を「または(||)」で合わせた範囲、と考えることもできます。この2つの見方が同じ形になることが、ド・モルガンの法則の核心です。
つまりこの図は「!A || !B」と全く同じ意味になります。
式の見た目は違いますが、ベン図で表すと同じ形になります。「書き換えている」というよりも、「同じ意味を別の読みやすい形で言い換えている」イメージです。
なぜ条件分岐は分かりにくくなるのか
条件分岐が分かりにくくなる原因のひとつは、「外側についた否定(!)」です。
例えば、次のようなコードを見てください。
if (!(A && B)) {
// 処理
}
このように外側に ! がついていると、
- 「AかつBでない、ってどういう意味だっけ?」と頭の中で反転させる必要がある
- 条件の意図が直感的に読み取りにくい
という状態になります。初心者はもちろん、慣れたエンジニアでも一瞬止まる書き方です。
ド・モルガンの法則で書き換えてみる
この条件は、ド・モルガンの法則を使うと次のように書き換えられます。
変換のイメージ(疑似コード):
!(A && B)
→ !A || !B
Javaで書くと:
if (!A || !B) {
// 処理
}
外側にあった ! が、それぞれの条件に分かれることで、
- 条件が分解され、一つひとつの意味が読み取りやすくなる
- 「Aが成立しない場合」「Bが成立しない場合」をそれぞれ独立して読み取れる
この「分解」が、コードの可読性(読みやすさ)の向上につながります。
実務でよくあるパターン
実務では、条件が増えるにつれてコードが急激に読みにくくなることがあります。
例えば、次のようなケースです。
if (!(user.isSales() && user.isActive() && !user.isDeleted())) {
// 処理
}
これをド・モルガンの法則で書き換えると、次のようになります。
if (!user.isSales() || !user.isActive() || user.isDeleted()) {
// 営業担当でない、またはアクティブでない、または削除済みの場合
}
書き換え後は、「営業担当でない」「アクティブでない」「削除済みである」という3つの条件が個別に読み取れるようになります。
なお、!user.isDeleted() の否定は user.isDeleted()(! が消える)になる点に注意してください。二重否定(!!)にならないよう気をつけましょう。
なぜ実務では条件が複雑になるのか
そもそも、なぜこのように条件が複雑になるのでしょうか。よくある原因としては次のようなものがあります。
- 手動登録によるデータミスや表記揺れ
- 修正できない過去データへの対応
- 仕様変更や例外ケースの積み重なり
本来はシンプルに書けるはずの処理でも、こうした要因によって例外が少しずつ増えていきます。その結果、条件が増え、ネストが深くなり、意図が分からなくなる——という状態になりがちです。
【重要】よくある間違い
ここで、よく混同されやすい書き方を確認しておきましょう。
次のコードを見てください。
if (!A && !B) {
// 処理
}
一見似ていますが、これは !(A && B) とは全く別の意味になります。
| 式 | 意味 |
|---|---|
!(A && B) → !A || !B | AとBが同時に成立しない(どちらか一方がダメならOK) |
!A && !B | AもBもどちらも成立しない(両方ダメな場合のみ) |
具体的な例で確認してみましょう。
例)A=true(ログイン済み)、B=false(管理者ではない)のときなどで置き換えてください
!(A && B)
→ !(true && false)
→ !(false)
→ true(条件成立)
!A && !B
→ (not true) && (not false)
→ false && true
→ false(条件不成立)
同じ状況でも結果が逆になります。条件の厳しさが全く違うので、混同しないよう注意しましょう。
まとめ
ド・モルガンの法則は、「コードを分かりやすくするための道具」としても活用できます。
- 外側の
!は読みにくい → 分解して内側に移す - 条件を分解すると、一つひとつの意味が読み取りやすくなる
- 似ている式でも、意味が全く違うことがある(
!(A&&B)と!A&&!Bは別物)
なお、ド・モルガンの法則で条件を分解した後、エラーケースを先にreturnする「ガード節」と組み合わせると、さらに読みやすいコードに整理できます。これは別の記事で改めて解説予定です。
このあたりを意識するだけでも、コードの可読性は大きく変わります。
おわりに
実際に自分も、コードレビューでこの考え方を指摘されて初めて「ここで使うのか」と気づきました。
基本情報で学んだ内容が、実務で思いがけず役立つこともあります。そのときの体験は、別の記事でまとめています。

コメント