
みなさんこんにちは、ガノー(Twitter:Ganohr)です。
今回はプログラミングにおける条件式で使用する「論理演算子」の話です。
- 論理演算子とは何か/そもそも演算子とは何か
- 論理演算子の種類とサンプルコード/論理演算子の留意点
- 複雑な条件式を分かりやすく記述するためのコーディングスタイル
について解説します。
なお、
この記事はサンプルコードをPHPで記述していますが、概ねJava、C#、C言語、JavaScript、VisualBasicに渡って共通するため、参考にされてください。
更新履歴
目次
- 1.論理演算子とはなにか?
- 1.1.論理否定演算子
- 1.2.論理積演算子
- 1.3.論理和演算子
- 1.4.排他的論理和演算子
- 1.4.1.PHPにおける排他的論理和の論理演算子
- 2.論理演算子を用いた複雑な条件式を分かりやすく、且つ、後々に修正しやすく記述するためのコーディングスタイル
- 2.1.||及び&&は同じレベルで半角丸括弧でまとめる
- 2.2.条件式を複数行で記述し、&&や||を前出しする
- 2.3.編集しやすいように同じレベルの条件式の各項のインデントを揃える
- 2.4.実際に条件を追加したり変更してみる
- 2.4.1.条件式の順序を入れ替える
- 2.4.2.条件式に追加の条件を加える
- 3.このコーディングスタイルの利点
- 4.最後に
論理演算子とはなにか?

PHPやJavaScript、Java、C#、C言語、VisualBasicを含め、多くのプログラミング言語においてand
演算子(論理積演算子)とor
演算子(論理和演算子)というものがあります。
‘論理演算子’(ろんりえんざんし)とは、特にプログラミングにおいて、条件式が真か偽かを判定するための演算子です。
‘演算子’とは、特にプログラミングにおいて特定のデータに対して処理を行う記述のことであり、論理演算子は扱うデータが整数値型または真偽値型が前提となります。ここでいう処理とは、「条件判定処理」(与えられたデータを真偽値型へ変換する処理)のことです。
論理演算子には以下の種類があります。
【論理演算子の種類】
- 論理否定演算子
- 論理積演算子
- 論理和演算子
- 排他的論理和演算子
論理否定演算子

‘論理否定演算子’(ろんりひていえんざんし)とは、与えられたデータを反転する演算子です。論理演算子の中では唯一の‘単項演算子’(たんこうえんざんし)であり、処理するデータが1つのみに限定されます。
var_dump( ! false );
var_dump( !( 0 * 0 ) );
bool(true)
bool(true)
1行目は論理否定演算子である「!
」(半角エクスクラメーションマーク)でbool値
のfalse
を反転して出力しています。そのため画面にはbool(true)
と表示されます。
2行目はちょっと難解ですが、「0 × 0」の結果である「0」を論理否定演算子で反転してその結果を出力しています。そのため、画面にはbool(true)
と表示されます。
PHPを始め、多くのプログラミング言語においては真偽値は「false == 0
」であり、「true === ! false
」であると定義されていることが関係しています。要は0
はfalse
であり、それを論理否定演算子で反転すると「true
」になるということです。
なお、基本的に言語に関係なくfalse == 0
ですが、「true
が1か、はたまた別の値か」は言語依存となります。
echo ! false . PHP_EOL;
echo ! ( 0 * 0 ) . PHP_EOL;
1
1
そのため、条件判定においては、こうした技術仕様には注意が必要となります。
論理積演算子
‘論理積演算子’(ろんりせきえんざんし)は、前後の条件式を繋げていく演算子であり、‘二項演算子’(にこうえんざんし)の一つです。前後の条件が「成り立つ場合は「真」(true
)へ変換」し、「成り立たない場合は「偽」(false
)へ変換」します。
分かりやすく言えば、
論理積演算子 ≒ 条件文の「且つ」を表すものです。
【論理積演算子のサンプルコード1】
var_dump( false and false );
var_dump( false and true );
var_dump( true and false );
var_dump( true and true );
bool(false)
bool(false)
bool(false)
bool(true)
【論理積演算子のサンプルコード2】
var_dump( false && false );
var_dump( false && true );
var_dump( true && false );
var_dump( true && true );
※ 出力結果はサンプルコード1と同じ為割愛
PHPでは論理積演算子はand
か&&
と記述します。ただし、基本的には&&
の方だけを利用してください。
and
ではなく&&
を使うべきなのか?PHP以外の多くのプログラミング言語では、and
という記述が許容されません。プログラマーは多くのプログラミング言語を利用します。論理積演算子は多くのプログラミング言語において&&
と記載するため、「and
を利用すると将来そのコードを移植する際に、無用な変換コストが発生」します。
加えてPHPの場合、and
演算子は代入演算子(=
)より優先順位が低いため、数々のバグを生み出してきました。

&&
演算子と&
演算子の違いは?PHPやC言語などのプログラミング言語においては、&&
演算子と&
演算子が存在します。
この両者は似た挙動を行いますが、実際は似て非なるものです。初心者のうちは「条件式では必ず&&
や||
を使うべき」と覚えてしまって問題ありません。
この両者の決定的な違いは「&&
演算子は論理演算子」であり、「&
演算子はビット演算子」である点です。
より詳細な違いについての解説は、以下の記事をお読みください。

論理和演算子
‘論理和演算子’(ろんりわえんざんし)は、前後の条件式を繋げていく演算子であり、‘二項演算子’(にこうえんざんし)の一つです。「前後の条件のうち一つでも成り立つ場合は「真」(true
)へ変換」し、「全て成り立たない場合は「偽」(false
)へ変換」します。
分かりやすく言えば、
論理和演算子 ≒ 条件文の「又は」を表すものです。
【論理積演算子のサンプルコード1】
var_dump( false or false );
var_dump( false or true );
var_dump( true or false );
var_dump( true or true );
bool(false)
bool(true)
bool(true)
bool(true)
【論理積演算子のサンプルコード2】
var_dump( false || false );
var_dump( false || true );
var_dump( true || false );
var_dump( true || true );
※ 出力結果はサンプルコード1と同じ為割愛
PHPでは論理和演算子はor
か||
と記述します。ただし、基本的には||
の方だけを利用してください。
排他的論理和演算子

‘排他的論理和演算子’(はいたてきろんりわえんざんし)は、前後の条件式を繋げていく演算子であり、‘二項演算子’(にこうえんざんし)の一つです。「前後の条件のうち一つだけ成り立つ場合は「真」(true
)へ変換」し、「全てが成り立たない場合や全てが成り立つ場合は「偽」(false
)へ変換」します。
分かりやすく言えば、
排他的論理和 ≒ 条件文が「片方だけ成り立つか」を表すものです。
【排他的論理和のサンプルコード】
var_dump( false xor false );
var_dump( false xor true );
var_dump( true xor false );
var_dump( true xor true );
bool(false)
bool(true)
bool(true)
bool(false)
PHPにおける排他的論理和の論理演算子
PHPにおける排他的論理和の論理演算子は、&&
や||
のように優先順位が高いものは存在しません。
一応、xor
演算子はありますが、or
やand
のように優先順位において代入演算子よりも低い優先順位になっており、バグの温床になっています。
またビット演算子としては
^
が定義されていますが、そもそもxor
を条件式の内部で用いるべきではありません。
$ok_but = false ^ true;
var_dump($ok_but);
$ok_so = (bool)(false ^ true);
var_dump($ok_so);
$ng = false xor true;
var_dump($ng);
$better = (false xor true);
var_dump($better);
int(1)
bool(true)
bool(false)
bool(true)
なお、xor
のような判定が必要な場合、&&
及び||
を用いて排他的論理和を表現できるためそちらを用いることを推奨します。
var_dump( ( false && ! false ) || ( ! false && false ) );
var_dump( ( true && ! false ) || ( ! true && false ) );
var_dump( ( false && ! true ) || ( ! false && true ) );
var_dump( ( true && ! true ) || ( ! true && true ) );
bool(false)
bool(true)
bool(true)
bool(false)
次ページにて、論理演算子を用いた複雑な条件式を分かりやすく記述するためのコーディングスタイルについて言及します。
WordPressの不具合対応/カスタマイズ¥15,000~
PC歴25年超、SE歴10年超、WordPress運営歴7年超、WordPressエンジニア歴5年超のスキルとノウハウを提供します
当サイト管理人の「ガノー」(Ganohr)は、日本最大手且つ東証一部上場企業が運営するクラウドソーシングサイト『Lancers』にて、認定ランサーとして活動しています。
※ 認定ランサーとはLancersにより様々な能力 ( 高い仕事遂行率・高い顧客満足度・多くの実績、など ) を評価したプロフェッショナルを認定する制度です。
コメントを書く