条件文・条件式の論理和と論理積と論理否定を分かりやすく解説!コーディングスタイルも解説

条件文・条件式の論理和と論理積と論理否定を分かりやすく解説!コーディングスタイルも解説
条件文・条件式の論理和と論理積と論理否定を分かりやすく解説!コーディングスタイルも解説

 

 
読了目安:139

Are you want to translate this page to English? Please click this link to translate via ‘©Google Translate'!

ganohr.net favicon

みなさんこんにちは、ガノー(Twitter:Ganohr)です。

今回はプログラミングにおける条件式で使用する「論理演算子」の話です。

  • 論理演算子とは何か/そもそも演算子とは何か
  • 論理演算子の種類とサンプルコード/論理演算子の留意点
  • 複雑な条件式を分かりやすく記述するためのコーディングスタイル

について解説します。

 

なお、

この記事はサンプルコードをPHPで記述していますが、概ねJava、C#、C言語、JavaScript、VisualBasicに渡って共通するため、参考にされてください。

更新履歴
2023/02/17 公開

論理演算子とはなにか?

論理積と論理和の解説画像
論理積と論理和の解説画像。複数の条件文を「つなげる」効果がある。

 

PHPやJavaScript、Java、C#、C言語、VisualBasicを含め、多くのプログラミング言語においてand演算子(論理積演算子)とor演算子(論理和演算子)というものがあります。

 

論理演算子’(ろんりえんざんし)とは、特にプログラミングにおいて、条件式が真か偽かを判定するための演算子です。

演算子’とは、特にプログラミングにおいて特定のデータに対して処理を行う記述のことであり、論理演算子は扱うデータが整数値型または真偽値型が前提となります。ここでいう処理とは、「条件判定処理」(与えられたデータを真偽値型へ変換する処理)のことです。

 

論理演算子には以下の種類があります。

論理演算子の種類

  • 論理否定演算子
  • 論理積演算子
  • 論理和演算子
  • 排他的論理和演算子
サムネイルPHP: 論理演算子 - Manual ... 外部サイトへアクセスwww.php.net

論理否定演算子

論理否定の解説画像
論理否定の解説画像。Aの否定は「A以外」であり、PHPやC言語含め、多くのプログラミング言語では「!A」として論理否定を記述する。

 

論理否定演算子’(ろんりひていえんざんし)とは、与えられたデータを反転する演算子です。論理演算子の中では唯一の‘単項演算子’(たんこうえんざんし)であり、処理するデータが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」であると定義されていることが関係しています。要は0falseであり、それを論理否定演算子で反転すると「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で記述していますがJavaScript/Java/C/C#で共通した事項を扱っています ... 続きを読むganohr.net2023-02-17

 

 
メモ
&&演算子と&演算子の違いは?

PHPやC言語などのプログラミング言語においては、&&演算子と&演算子が存在します。

この両者は似た挙動を行いますが、実際は似て非なるものです。初心者のうちは「条件式では必ず&&||を使うべき」と覚えてしまって問題ありません。

 

この両者の決定的な違いは「&&演算子は論理演算子」であり、「&演算子はビット演算子」である点です。

より詳細な違いについての解説は、以下の記事をお読みください。

サムネイル論理演算子とビット演算子の違いは?「&&」と「&」や、「||」と「|」の違いや短絡評価による効率化まで解説この記事では&&や||などの論理演算子と&や|などのビット演算子の違いを把握するためにサンプルコードを用いて解説します※サンプルコードはPHPで記述していますがJavaScript/Java/C/C#で共通した事項を扱っています ... 続きを読むganohr.net2023-02-17

論理和演算子

論理和演算子’(ろんりわえんざんし)は、前後の条件式を繋げていく演算子であり、‘二項演算子’(にこうえんざんし)の一つです。「前後の条件のうち一つでも成り立つ場合は「真」(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演算子はありますが、orandのように優先順位において代入演算子よりも低い優先順位になっており、バグの温床になっています。

 

またビット演算子としては^が定義されていますが、そもそも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により様々な能力 ( 高い仕事遂行率・高い顧客満足度・多くの実績、など ) を評価したプロフェッショナルを認定する制度です。

 

Cカテゴリの最新記事