テクノロジー

2023年2月2日

演算子の種類と優先順位

演算子の種類と使い方、優先順位を理解できる

演算子で条件を表現する三項演算子(条件演算子)[? と :]

条件分岐を演算子で実装できるのが三項演算子です。
三項演算子の構文は以下の通りです。

条件式 ? 条件式の評価が真だった時の処理 : 条件式の評価が偽だった時の処理

if で記述した条件分岐を、三項演算子を使って書き直してみます。

[例]

<?php
 
$number = intVal(readline('数字を入力してください' . PHP_EOL));
 
if ($number >= 5) {
    echo 'High' . PHP_EOL;
} else {
    echo 'Low' . PHP_EOL;
}

標準入力で受け取った値が5以上の場合は High 、そうでない場合は Low と出力するプログラムです。
三項演算子を使うと、1行で書けます。
ただし、必ずしも読みやすくなるとは限らないので注意してください。

<?php
 
$number = intVal(readline('数字を入力してください' . PHP_EOL));
echo ($number >= 5) ? 'High' . PHP_EOL : 'Low' . PHP_EOL;

Image from Gyazo

「かつ」「または」「〜ではない」を表現する論理演算子[&&、||、and、or、!]

論理演算子は「かつ」「または」「〜ではない」を表現する演算子です。

&& 「かつ」

&&条件式1 && 条件式2 という形で記述します。
「条件式1と条件式2のどちらも真(true)の場合、真(true)を返す」を意味します。

[例]

<?php
 
$a = 3;
$b = 7;
 
// 両方の条件を満たす
echo '$aが10未満 かつ $bが10未満' . PHP_EOL;
var_dump($a < 10 && $b < 10);
 
// 条件1のみ満たす
echo '$aが10未満 かつ $bが10以上' . PHP_EOL;
var_dump($a < 10 && $b >= 10);
 
// 条件2のみ満たす
echo '$aが10以上 かつ $bが10未満' . PHP_EOL;
var_dump($a >= 10 && $b < 10);
 
// 両方の条件を満たさない
echo '$aが10以上 かつ $bが10以上' . PHP_EOL;
var_dump($a >= 10 && $b >= 10);

[実行結果]

$aが10未満 かつ $bが10未満
bool(true)
$aが10未満 かつ $bが10以上
bool(false)
$aが10以上 かつ $bが10未満
bool(false)
$aが10以上 かつ $bが10以上
bool(false)

&&の代わりにandを使用することも可能です。

「条件式1と条件式2のどちらも真(true)の場合、真(true)を返す」と説明しましたが、実際には以下のような評価が行われています。

  1. まず条件式1を評価する
  2. 条件式が真なら条件式2を評価しに行く
  3. 条件式1が偽なら偽(false)が確定するので偽(false)を返し、条件式2を評価せず終了
  4. 条件式2を評価し、真なら真(true)を返し、偽なら偽(false)を返す

つまり、条件式1を評価した時に偽であれば偽(false)が確定し、条件式2は評価しないのです。

上記の例の、$a < 10 && $b < 10の式についての式について見てみます。
はじめに、変数 $a3、変数 $b7 を代入します。
$a < 10 が正しいかどうかを判別します。こちらは true を返します(条件式1の部分)。
条件式1が真だったので条件式2を評価します。
$b < 10 が正しいかどうかを判別します。こちらも true を返します(条件式2の部分)。
&& を使用すると、2つの条件式がどちらも true を返すため、結果は true になります。

各条件式による、&& の結果は以下のようになります。

各条件式による、&& の結果は以下のようになります。

Image from Gyazo

|| 「または」

||条件式1 || 条件式2 という形で記述します。
「条件式1と条件式2のどちらも真(true)、もしくはどちらかが真(true)の場合、真(true)を返す」を意味します。

[例]

<?php
 
$a = 3;
$b = 7;
 
// 両方の条件を満たす
echo '$aが10未満 または $bが10未満' . PHP_EOL;
var_dump($a < 10 \\|\\| $b < 10);
 
// 条件1のみ満たす
echo '$aが10未満 または $bが10以上' . PHP_EOL;
var_dump($a < 10 \\|\\| $b >= 10);
 
// 条件2のみ満たす
echo '$aが10以上 または $bが10未満' . PHP_EOL;
var_dump($a >= 10 \\|\\| $b < 10);
 
// 両方の条件を満たさない
echo '$aが10以上 または $bが10以上' . PHP_EOL;
var_dump($a >= 10 \\|\\| $b >= 10);

[実行結果]

$aが10未満 または $bが10未満
bool(true)
$aが10未満 または $bが10以上
bool(true)
$aが10以上 または $bが10未満
bool(true)
$aが10以上 または $bが10以上
bool(false)

||の代わりにorを使用することも可能です。

こちらは「条件式1と条件式2のどちらも真(true)、もしくはどちらかが真(true)の場合、真(true)を返す」と説明しましたが、実際には以下のような評価が行われています。

  1. まず条件式1を評価する
  2. 条件式1が真なら真(true)が確定するので真(true)を返し、条件式2を評価せず終了
  3. 条件式1が偽なら条件式2を評価しに行く
  4. 条件式2を評価し、真なら真(true)を返し、偽なら偽(false)を返す

つまり、条件式1を評価した時に真であれば真(true)が確定し、条件式2は評価しません。

上記の例の $a < 10 \|\| $b < 10 の式について見てみます。

  1. はじめに、変数 $a3、変数 $b7 を代入します。
  2. $a < 10 が正しいかどうかを判別し、真なので true を返し(条件式1の部分)終了します。
  3. || を使用すると、2つの条件式がどちらかが true を返すため、結果は true になります。
    条件式の結果による || の結果は以下のようになります。

Image from Gyazo

! 「〜でない」

!は、!(条件式) という形で記述します。
「条件式が真(true)の場合、偽(false)を返す」を意味します。

[例]

<?php
 
$a = 3;
 
#// 条件式が偽のため、真になる
echo '$aが10と同じ' . PHP_EOL;
var_dump(!($a === 10));
 
// 条件式が真のため、偽になる
echo '$aが3と同じ' . PHP_EOL;
var_dump(!($a === 3));

[実行結果]

$aが10と同じ
bool(true)
$aが3と同じ
bool(false)

!($a === 10) の式について詳しく説明します。

  1. はじめに、変数 $a3を代入します。
  2. $a === 10 が正しいかどうかを判別します。こちらは false を返します。
  3. ! を使用すると、条件式が true を返すため、結果は false になります。

条件式の結果による ! の結果は以下のようになります。

Image from Gyazo

代入演算子・複合演算子[= += -= など]

これまで気にせずに使ってきた = も、代入演算子という演算子です。
また、$n += 1;$n = $n + 1;の短縮形)のように使用する代入演算子は 複合演算子 といいます。

演算子の優先順位

たくさんの演算子がありますが、演算子には優先順位があります。

具体的な式の例で確認してみましょう。

[例]

<?php
 
$a = 3;
$b = 7;
$c = 9;
$d = 11;
 
var_dump($a < 10 && $b < 10 \\|\\| $c > 10 && $d < 10);
var_dump($a < 10 && ($b < 10 \\|\\| $c > 10) && $d < 10);

[実行結果]

bool(true)
bool(false)

上の式の説明

$a < 10 && $b < 10 \\|\\| $c > 10 && $d < 10の式について詳しく説明します。

  1. はじめに、変数 $a3 、変数 $b7 、変数 $c9、変数 d11 を代入します。
  2. &&|| より優先度が高いため、$a < 10 && $b < 10$c > 10 && $d < 10 を先に判別します。
  3. $a < 10 && $b < 10 を判別します。こちらは左辺 ($a < 10) が真であり右辺 ($b < 10) も真なので true を返します。
  4. $c > 10 && $d < 10 を判別します。こちらは左辺 ($c > 10) が偽なので false を返します。
  5. 次に返した値を使って、true || false を判別します。こちらは true を返し、出力します。

下の式の説明

続いて、$a < 10 && ($b < 10 \\|\\| $c > 10) && $d < 10 の式について詳しく説明します。

  1. はじめに、変数 $a3、変数 $b7、変数 $c9、変数 d に 11 を代入します。
  2. 優先される () から処理を行いますので、$b < 10 \\|\\| $c > 10 を判別します。こちらは左辺 ($b < 10) が真なので true を返します。
  3. 次に、返した true を使って、a < 10 && true && d < 10 を判別します。こちらは true && true && false から false を返し、出力します。

このように、演算の優先度を設定することで、演算する順番が変わります。

まとめ

  • 三項演算子は条件分岐を表現できる、よく使われる演算子である。
  • 論理演算子は「かつ」「または」「〜ではない」を表現することができる演算子である。
  • 演算子には優先順位がある。

公式ドキュメント・参考情報

1. 優先順位

ダイビックのことをもっと知ってみませんか?