論理演算子 と 三項演算子 と Null合体演算子

もくじ

演算子

演算子とは

演算子(えんざんし、英: operator)は、数式やコンピュータプログラミング言語などで、各種の演算を表わす記号・シンボルである。

参考:演算子 - Wikipedia

誤解を恐れずいうと、式における記号の部分です。

まず演算子とは何かを理解し、タイトルにある論理演算子三項演算子Null合体演算子を解説します。 さくっと軽く、タイトル以外の演算子をふたつ見てみましょう。

代入演算子

=

左辺に、右辺を代入する時に使います。

x = y;

このとき誤解してはいけないのは、一般的なx = yという意味ではなく、xyという値を代入しているというところです。

また、比較演算子と共に用いることもあります。

x += y; // x = x + y;と同じ

xyを加算した値を、x代入します。ややこしいですね。これは慣れれば気にならなくなると思います。

比較演算子

== != === < >=など

式の左辺と右辺を比較する時に使用します。比較した結果を真偽値で返します。

var x = 2;
var y = 3;
return x == y; // 結果:false

論理演算子

論理演算子とは

論理演算子 (Logical operators) は、基本的に真偽(論理)値とともに用いられ真偽値を返します。しかし、&& および || 演算子は真偽値ではない値も使うことができるため、その場合は、真偽値ではない値を返すことがあります。その場合の考え方は以下の「説明」の欄の記載の通りとなります。

参考:論理演算子 - JavaScript | MDN

演算子の種類

演算子 使用例 説明
AND演算子(&&) A AND B
A && B
真偽値と共に使われた場合
演算対象の両方(AとB)がtrue ならばtrueを返し、そうでなければfalseを返します。
真偽値がない場合
Aをfalseと見ることができる場合はAを返し、そうでない場合はBを返します。
OR演算子 (||) A OR B
A || B
真偽値と共に使われた場合
演算対象のどちらか(AかB)がtrueならばtrueを返し、両方ともfalseの場合はfalse を返します。
真偽値がない場合
Aをtrueと見ることができる場合はAを返します。そうでない場合はBを返します。
NOT演算子 (!) NOT A
!A
Aがtrueと見ることができる場合はfalseを返します。そうでない場合は、trueを返します。

ショートサーキット評価

A && Bという論理式があった場合、Aがfalseならその時点で式全体の結果はfalseで確定するため、Bがどうであるかについてはチェックされません。

論理演算子は左から右へ評価されるため、論理演算子で左辺を評価した時点で論理式の結果が確定した場合には右辺の評価を行わないことを、ショートサーキット評価といいます。

使用例

a1 = true  && true      // true
a2 = true  && false     // false
a3 = false && true      // false
a4 = false && (3 == 4)  // false
a5 = "Cat" && "Dog"     // 結果:Dog(真偽値がない場合に相当)
a6 = false && "Cat"     // false(左辺をfalseと見ることができるので左辺を返す)
a7 = "Cat" && false     // false(左辺をfalseと見ることができないので右辺を返す)
o1 = true  || true       // true
o2 = false || true       // true
o3 = true  || false      // true
o4 = false || (3 == 4)   // false
o5 = "Cat" || "Dog"      // 結果:Cat(真偽値がない場合に相当)
o6 = false || "Cat"      // 結果:Cat(左辺をtrueと見ることができないので左辺を返す)
o7 = "Cat" || false      // 結果:Cat(左辺をtrueと見ることができないので右辺を返す)
n1 = !true      // false
n2 = !false      // true
n3 = !"Cat"      // false

変換規則

bCondition1 && bCondition2
!(!bCondition1 || !bCondition2)
bCondition1 || bCondition2
!(!bCondition1 && !bCondition2)
!!bCondition
bCondition

三項演算子

三項演算子とは

3つの項目を使用するので三項演算子といいます。三項とるのはこれだけです。条件演算子とも呼ばれます。

条件式 ? A : B

条件式がtrueならAを返します。条件式がfalseならBを返します。

使用例

$age = 26;
$beverage = ($age > 20) ? "ビール" : "ジュース";
echo($beverage); // "ビール"

($age > 20) ? "ビール" : "ジュース"の部分が三項演算子です。

$age > 20がtrueならビール$age > 20がfalseならジュースということになります。そしてその結果を$beverageに代入しているので、最終的な結果はビールとなります。

const valueA = true ? "A" : "B";
console.log(valueA); // => "A"
const valueB = false ? "A" : "B";
console.log(valueB); // => "B"

Null合体演算子

Null合体演算子とは

論理演算子の一種です。この演算子は左辺が null または undefined の場合に右の値を返し、それ以外の場合に左の値を返します。

参考:Null合体演算子 - JavaScript | MDN

PHPにおいては、PHP7.0から追加されました。

使用例

??を用いて記述します。

A ?? B

Null合体演算子は左辺(A)がnullまたはundefinedの場合に右辺(B)の値を返します。

簡単に言うと、「Aの中身が何もなかったらB」なんです。便利なのは、続けて書けると言うことです!

今回はPHPを例に書いてみます。

$A = null;
$B = 0;
$C = "foo";

$data = $A ?? $B ?? $C;
echo($data); // 結果:0

例1では、変数Aがnullなので変数Bを返しています。このとき変数Cは無視されます。例2も見てみましょう。

$A = null;
// 変数Bを定義せず未定義(undefined)にする
$C = "foo";

$data = $A ?? $B ?? $C;
echo($data); // 結果:foo

例2では、変数Aがnullなので変数Bを返すはずなんですが、変数Bは未定義なのでさらに変数Cが結果的に返ってきます。

このように、三項演算子isset()を組み合わせるよくありがちなパターンを簡単に書けるようにしたのが三項演算子です。

可読性に注意

三項演算子やNull合体演算子を使うことで簡単な記述が可能になりました。しかし、記述が複雑になっていくと可読性が下がるので使い過ぎや依存には注意しましょう。

参考URL

論理演算子 - JavaScript | MDN

Null合体演算子 - JavaScript | MDN

演算子 · JavaScript Primer #jsprimer

PHP: 新機能 - Manual

実装例:PHPのnull合体演算子で「無かったら」の処理が簡単 - Qiita

式と演算子 - JavaScript | MDN