Если бы у всех операторов был один и тот же уровень приоритета, то они обрабатывались бы в том порядке, в котором встречались интерпретатору. Фактически многие операторы имеют одинаковый уровень приоритета. Рассмотрим ряд операторов, представленных в примере.
Пример. Три эквивалентных выражения
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 | Логический |
Операторы | Взаимосвязанность операторов |