テクノロジー
2023年2月2日演算子の種類と優先順位
演算子の種類と使い方、優先順位を理解できる
目次
演算子で条件を表現する三項演算子(条件演算子)[? と :]
「かつ」「または」「〜ではない」を表現する論理演算子[&&、||、and、or、!]
&& 「かつ」
|| 「または」
! 「〜でない」
代入演算子・複合演算子[= += -= など]
演算子の優先順位
まとめ
公式ドキュメント・参考情報
演算子で条件を表現する三項演算子(条件演算子)[? と :]
条件分岐を演算子で実装できるのが三項演算子です。
三項演算子の構文は以下の通りです。
条件式 ? 条件式の評価が真だった時の処理 : 条件式の評価が偽だった時の処理
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;
「かつ」「または」「〜ではない」を表現する論理演算子[&&、||、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を評価する
- 条件式が真なら条件式2を評価しに行く
- 条件式1が偽なら偽(
false)が確定するので偽(false)を返し、条件式2を評価せず終了 - 条件式2を評価し、真なら真(
true)を返し、偽なら偽(false)を返す
つまり、条件式1を評価した時に偽であれば偽(false)が確定し、条件式2は評価しないのです。
上記の例の、$a < 10 && $b < 10の式についての式について見てみます。
はじめに、変数 $a に 3、変数 $b に 7 を代入します。
$a < 10 が正しいかどうかを判別します。こちらは true を返します(条件式1の部分)。
条件式1が真だったので条件式2を評価します。
$b < 10 が正しいかどうかを判別します。こちらも true を返します(条件式2の部分)。
&& を使用すると、2つの条件式がどちらも true を返すため、結果は true になります。
各条件式による、&& の結果は以下のようになります。
各条件式による、&& の結果は以下のようになります。
|| 「または」
|| は 条件式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が真なら真(
true)が確定するので真(true)を返し、条件式2を評価せず終了 - 条件式1が偽なら条件式2を評価しに行く
- 条件式2を評価し、真なら真(
true)を返し、偽なら偽(false)を返す
つまり、条件式1を評価した時に真であれば真(true)が確定し、条件式2は評価しません。
上記の例の $a < 10 \|\| $b < 10 の式について見てみます。
- はじめに、変数
$aに3、変数$bに7を代入します。 $a < 10が正しいかどうかを判別し、真なのでtrueを返し(条件式1の部分)終了します。||を使用すると、2つの条件式がどちらかがtrueを返すため、結果はtrueになります。
条件式の結果による||の結果は以下のようになります。
! 「〜でない」
!は、!(条件式) という形で記述します。
「条件式が真(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) の式について詳しく説明します。
- はじめに、変数
$aに3を代入します。 $a === 10が正しいかどうかを判別します。こちらはfalseを返します。!を使用すると、条件式がtrueを返すため、結果はfalseになります。
条件式の結果による ! の結果は以下のようになります。
代入演算子・複合演算子[= += -= など]
これまで気にせずに使ってきた = も、代入演算子という演算子です。
また、$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の式について詳しく説明します。
- はじめに、変数
$aに3、変数$bに7、変数$cに9、変数dに11を代入します。 &&が||より優先度が高いため、$a < 10 && $b < 10と$c > 10 && $d < 10を先に判別します。$a < 10 && $b < 10を判別します。こちらは左辺($a < 10)が真であり右辺($b < 10)も真なのでtrueを返します。$c > 10 && $d < 10を判別します。こちらは左辺($c > 10)が偽なのでfalseを返します。- 次に返した値を使って、
true || falseを判別します。こちらはtrueを返し、出力します。
下の式の説明
続いて、$a < 10 && ($b < 10 \\|\\| $c > 10) && $d < 10 の式について詳しく説明します。
- はじめに、変数
$aに3、変数$bに7、変数$cに9、変数 d に11を代入します。 - 優先される () から処理を行いますので、
$b < 10 \\|\\| $c > 10を判別します。こちらは左辺($b < 10)が真なのでtrueを返します。 - 次に、返した
trueを使って、a < 10 && true && d < 10を判別します。こちらはtrue && true && falseからfalseを返し、出力します。
このように、演算の優先度を設定することで、演算する順番が変わります。
まとめ
- 三項演算子は条件分岐を表現できる、よく使われる演算子である。
- 論理演算子は「かつ」「または」「〜ではない」を表現することができる演算子である。
- 演算子には優先順位がある。



