テクノロジー
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
を返し、出力します。
このように、演算の優先度を設定することで、演算する順番が変わります。
まとめ
- 三項演算子は条件分岐を表現できる、よく使われる演算子である。
- 論理演算子は「かつ」「または」「〜ではない」を表現することができる演算子である。
- 演算子には優先順位がある。