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日