UPDATE:2020年07月13日
PHP の 演算子の優先順位と結合性
- 演算子には 評価の優先順位 がある
- ( ) 括弧 を使用して 計算の優先順位を変更
- ( ) 括弧 は 入れ子 にして使用できる
その場合 内側の ( )括弧 内から計算 される - 優先順位が同じ場合は 結合性 によって 評価順 が決まる
- 結合性は 左右どちらから計算するか の決まり
- 結合性は 優先順位 であり演算子によって left 或いは right と決まっている
優先順位について
- 演算子には 評価の優先順位がある
演算子 には 評価の優先順位 があります。式の中に複数の演算子が登場した場合、優先順位に従って評価されます。例えば「*(乗算)」は「+(加算)」より優先されます。
1 2 3 4 | <!-- サンプルコード --> <?php echo 10 + 5 * 8; ?> |
結果は
となります。
5 * 8 の「*(乗算)」を先に行ってから、10 + 40 の「+(加算)」を行います。
では、「/(除算)」と「*(乗算)」の場合はどうでしょう。
1 2 3 4 | <!-- サンプルコード --> <?php echo 10 / 5 * 8; ?> |
結果は
となります。
10 / 5 の「*(除算)」を先に行ってから、2 * 8 の「+(乗算)」を行います。「/(除算)」と「*(乗算)」の優先順位は同じで、同じ場合、演算子の結合性によって評価の順番が決まります。
結合性については以降で説明します。
特定部分の計算を優先させたい場合
- ( ) 括弧 を使用して 計算の優先順位を変更
- ( ) 括弧 は 入れ子 にして使用できる
その場合 内側の ( )括弧 内から計算 される
強制的に特定部分の計算を優先させる場合は「()括弧」を使用します。「()括弧」内の計算が優先されて評価されます。
1 2 3 4 5 | <!-- サンプルコード --> <?php $i = (7 + 5) * 8; echo $i; ?> |
結果は
となります。
7 + 5 の「+(加算)」が先に計算され、次に、12 * 8 の「*(乗算)」が計算されます。
「()括弧」を入れ子にした場合、内側の「()括弧」内から計算されます。
1 2 3 4 | <!-- サンプルコード --> <?php echo ((4 + 6) * 4) / 4; ?> |
結果は
となります。
優先順位が同じ場合
- 優先順位が同じ場合は 結合性 によって 評価順 が決まる
- 結合性は 左右どちらから計算するか の決まり
- 結合性は 優先順位 であり演算子によって left 或いは right と決まっている
同じ優先順位の演算子が式に複数使用された場合、その演算子の結合性によって評価する順番が 決まります。
演算子は、右(right)から計算するのか、あるいは左(left)から計算するのか、がそれぞれ決まっています。それが演算子の結合性です。
右 から評価するのか 左 から評価するのかによって結果が異なります。
1 2 3 4 | <!-- サンプルコード --> <?php echo 4 / 4 * 4; ?> |
左から評価した場合
[ 4 ]
右から評価した場合
[ 0.25 ]
乗算と除算の結合性はleftなので左から評価されます。
従って、
結果は
となります。
以下は両方同じ意です。
1 2 3 4 5 6 | <!-- サンプルコード --> <?php echo 4 / 4 * 4 / 4; echo "<br>\n"; echo ((4 / 4) * 4) / 4; ?> |
下の式は「括弧()」を使用して明示的に左から計算するようになっていますが、
乗算と除算の結合性は左(left)なので同じ意になります。
結果は
となります。
優先順位と結合性の表
優先順位の数字が高い方が優先されます。
| 優先順位 | 結合時の評価 | 演算子 |
|---|---|---|
| 19 | 結合しない | new |
| 18 | left | [ |
| 17 | 結合しない | ++ |
| 結合しない | — | |
| right | ~ | |
| right | (int) (float) (string) (array) (object) (bool) | |
| right | @ | |
| 結合しない | instanceof | |
| right | ! | |
| 16 | left | * / % |
| 15 | left | + – . |
| 14 | left | << >> |
| 13 | 結合しない | < <= > >= <> |
| 12 | 結合しない | == != === !== |
| 11 | left | & |
| 10 | left | ^ |
| 9 | left | | |
| 8 | left | && |
| 7 | left | || |
| 6 | left | ? : |
| 5 | right | = += -= *= /= .= %= &= |= ^= <<= >>= => |
| 4 | left | and |
| 3 | left | xor |
| 2 | left | or |
| 1 | left | , |
分かりやすい式の記述
- 「*(乗算)」と「/(除算)」は「+(加算)」と「-(減算)」より 優先 させる
- それ以外は ( ) 括弧 を使用する
サンプルコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | <!-- サンプルコード --> <h3>乗算 優先順位</h3> <?php $i = 7 + 5 * 8; echo $i; ?> <h3>()括弧による優先順位の変更</h3> <?php $i = (7 + 5) * 8; echo $i; ?> <br><br> <h3>乗算 除算 結合性と()括弧による優先順位の変更</h3> <?php $i = 4 / 4 * 4; echo $i; echo '<br>'; $i = (4 / 4) * 4; echo $i; ?> <h3>乗算 除算 結合性と()括弧による優先順位の変更</h3> <?php $i = 4 / 4 * 4 / 4; echo $i; echo '<br>'; $i = ((4 / 4) * 4) / 4; echo $i; ?> <h3>乗算 除算 結合性と()括弧による優先順位の変更</h3> <?php $i = 1 / 2 * 3 / 4 * 5; echo $i; echo '<br>'; $i = (((1 / 2) * 3) / 4) * 5; echo $i; ?> |
47
()括弧による優先順位の変更
96
乗算 除算 結合性と()括弧による優先順位の変更
4
4
乗算 除算 結合性と()括弧による優先順位の変更
1
1
乗算 除算 結合性と()括弧による優先順位の変更
1.875
1.875
タグ(=記事関連ワード)
日付
最終更新日:2020年07月13日



