演算子の優先順位

一つの式の中に複数の演算子が含まれる場合、どの演算から行うのかによって計算結果が異なる場合があります。このような場合、あらかじめ決められた演算子の優先順位に従って演算する順番が決まります。ここでは PHP で用意されている演算子の優先順位について解説します。

演算子の優先順位

四則演算で使用した演算子や、今後解説していく演算子には優先順位が決まっています。例えば次の例を見てください。

5 + 4 * 3

5 + 4 の結果である 9 に対して 3 を乗算すれば 27 ですが、 5 に対して 4 * 3 の結果である 12 を加算すれば 17 となります。このようにどの演算から行うのかで結果は異なる場合があります。このように複数の演算子が使われている式では、演算子の優先順位に従って演算を行う順番が決まります。

四則演算に関する演算子の優先順位は以下のようになっています。

(優先順位が高い)
  *  /  %
  +  -
(優先順位が低い)

上の方が優先順位が高くなっています。そして同じ行の位置にある演算子は優先順位は同じです。 * / % の 3 つの演算子は + - よりも優先順位が高いです。また * / % の演算子の優先順位は同じであり、 + - の演算子の優先順位は同じです。

先ほどの例で言えば + よりも * の優先順位が高いため、先に 4 * 3 の演算が行われます。そしてその後に 5 + 12 と言う演算が行われます。

なお同じ優先順位の演算子の場合には演算子毎に決まっている結合順位に従います。四則演算の演算子の結合順位は左から右のため、左に記述されている演算子から行われます。

4 / 2 * 2

上記の場合、 * と / の優先順位は同じですので、より左側にある / から先に演算が行われます。

括弧による優先順位の変更

演算子の優先順位とは異なる順序で演算を行いたい場合には括弧 () を使います。演算子の優先順位に関わらず括弧で囲まれた演算は先に演算が行われます。

(5 + 4) * 3

この場合、演算子だけを見ると + と * では * の優先順位が高いですが、括弧で囲われた演算が先に行われますのでまず 5 + 4 が演算され、次に 9 * 3 が演算されます。よって全体の演算結果は 27 となります。

括弧の中に複数の演算子が使われている場合は演算子の優先順位によって演算が行われます。また括弧が多重に使用されている場合は内側の括弧が先に演算されます。

2 * ((5 + 3) * 4 - (4 + 5) / 3)

上記の場合は次のように演算が行われます。

1)5 + 3 = 8     //  2 * (8 * 4 - (4 + 5) / 3)
2)4 + 5 = 9     //  2 * (8 * 4 - 9 / 3)
3)8 * 4 = 32    //  2 * (32 - 9 / 3)
4)9 / 3 = 3     //  2 * (32 - 3)
5)32 - 3 = 29   //  2 * 29
6)2 * 29 = 58

複雑な式であっても括弧と優先順位によって必ず演算される順序は1つに決まります。

サンプルコード

では簡単なプログラムで試してみます。

<?php
echo "5 + 3 * 4 = ", 5 + 3 * 4, "\n";
echo "(5 + 3) * 4 = ", (5 + 3) * 4;

作成したプログラムを sample.php として保存しました。その後でコマンドプロンプトを起動し、次のように実行しました。

php sample.php

演算子の優先順位

今回のサンプルでは同じような演算を行う二つの式で、括弧を付けることで結果がどう変わるのかを試してみました。

すべての演算子の優先順位と結合順位

四則演算に関する演算子だけでなく PHP で用意されている他の演算子の優先順位および結合順位は次のようになっています。

演算子結合順位
new無し
[
! ~ ++ -- (int)など @
* / %
+ - .
<< >>
< <= > >=無し
== != <> === !==無し
&
^
|
&&
||
?:
= += -= *= /= .= %= &= != ^= ~= <<= >>=
and
or
,

表の見方としては優先順位は上に行くほど高く下に行くほど低くなります。また同じ行に含まれる演算子は同じ優先順位です。

-- --

PHP で用意されている演算子の優先順位について解説しました。

( Written by Tatsuo Ikura )

プロフィール画像

著者 / TATSUO IKURA

これから IT 関連の知識を学ばれる方を対象に、色々な言語でのプログラミング方法や関連する技術、開発環境構築などに関する解説サイトを運営しています。