Материал предоставлен https://it.rfei.ru

Приоритетность операторов

Если бы у всех операторов был один и тот же уровень приоритета, то они обрабатывались бы в том порядке, в котором встречались интерпретатору. Фактически многие операторы имеют одинаковый уровень приоритета. Рассмотрим ряд операторов, представленных в примере.

Пример. Три эквивалентных выражения

1 + 2 + 3 - 4 + 52 - 4 + 5 + 3 + 15 + 2 - 4 + 1 + 3

Из примера видно, что, несмотря на перестановку чисел (и предшествующих им операторов), результат каждого выражения имеет значение 7, поскольку у oпeраторов «плюс» и «минус» одинаковый уровень приоритета. Можно проделать то же самое с операторами умножения и деления (см. пример).

Пример. Три выражения, которые также являются эквивалентными

1 * 2 * 3 / 4 * 52 / 4 * 5 * 3 * 15 * 2/4 * 1 * 3

В этом примере получаемое значение всегда равно 7,5. Но все меняется, когда в выражении присутствуют операторы с разными уровнями приоритета, как в следующем примере.

Пример. Три выражения, в которых присутствуют операторы с разными уровнями приоритета

1 + 2 * 3 – 4 * 52 – 4 * 5 * 3 + 15 + 2 - 4+1 * 3

Если бы не существовало приоритетности операторов, то в результате вычисления этих выражений получались бы числа 25, -29 и 12 соответственно. Но поскольку операторы умножения и деления имеют более высокий уровень приоритета по сравнению с операторами сложения и вычитания, вокруг частей выражения с их участием предполагается наличие скобок, и если их сделать видимыми, выражения будут выглядеть так, как показано в примере ниже.

Пример. Три выражения, в которых отображены предполагаемые скобки

1 + (2 * 3) - (4 * 5)
2 - (4 * 5 * 3) + 15 + 2 - 4 + (1 * 3)

Очевидно, что РНР должен сначала вычислить подвыражения, заключенные в скобки, для того чтобы получились частично вычисленные выражения, показанные в следующем примере.

Пример. Выражения после вычисления подвыражений в скобках

1 + (6) - (20)
2 - (60) + 15 + 2 - 4 + (4)

Окончательный результат вычисления этих выражений равен соответственно -13, -57 и 6 (что абсолютно отличается от результатов 25, -29 и 12, которые мы увидели бы при отсутствии приоритетности операторов).

Разумеется, исходную приоритетность операторов можно отменить, расставив собственные скобки, и принудительно получить результаты, показанные в самом начале, которые были бы получены в отсутствие приоритетности операторов (см. пример).

Пример. Принудительное выполнение вычислений справа налево

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

Теперь, если скобки расставлены правильно, мы видим значения 25, -29 и 12 соответственно.

В таблице перечислены операторы РНР в порядке их приоритетности от самого высокого до самого низкого уровня.

Операторы РНР, расположенные по уровню их приоритетности (сверху вниз)

Оператор(ы) Тип
() Скобки
++ -- Инкремент-декремент
! Логический
* / % Арифметические
+ - Арифметические и строковые
<< >> Побитовые
< <= > >= <> Сравнения
== != === !== Сравнения
& Поразрядный (и ссылочный)
^ Поразрядный
| Поразрядный
&& Логический
| |Логический
? : Трехкомпонентный
= += -= *= /= .= %= &= != ^= <<= >>= Присваивания
and Логический
xor Логический
or Логический
ОператорыВзаимосвязанность операторов