Что такое приоритет операции php
Перейти к содержимому

Что такое приоритет операции php

  • автор:

Приоритет математических операций в PHP

Математические операции PHP имеют такой же приоритет, как в обычной математике. То есть в начале выполняется умножение и деление, а потом уже сложение и вычитание. В следующем примере вначале 2 умножится на 2 и затем к результату прибавится 3 :

Не запуская код, определите, что выведется на экран:

Не запуская код, определите, что выведется на экран:

Не запуская код, определите, что выведется на экран:

Не запуская код, определите, что выведется на экран:

PHP: Приоритет операций

В школьной математике есть понятие «приоритет операции». Приоритет определяет, в какой последовательности должны выполняться операции.

Допустим, нам нужно вычислить такое выражение: 2 + 2 * 2 :

Интерпретатор производит арифметические вычисления в правильном порядке: сначала деление и умножение, потом сложение и вычитание, а приоритет возведения в степень выше всех остальных арифметических операций: 2 ** 3 * 2 вычислится в 16 .

Иногда вычисления должны происходить в другом порядке. В этом случае приоритет задают круглыми скобками, например: (2 + 2) * 2 . Скобки можно ставить вокруг любой операции. Они могут вкладываться друг в друга сколько угодно раз. Вот пара примеров:

 9 print_r(7 * 3 + (4 / 2) - (8 + (2 - 1))); // => 14 

В этом случае главное закрывать скобки в правильном порядке. Это часто становится причиной ошибок не только у новичков, но и у опытных программистов. Для удобства можно сразу ставить открывающую и закрывающую скобки, а потом писать внутреннюю часть.

Сейчас большинство редакторов кода делают это автоматически. Например, мы ставим открывающую скобку, а он автоматически ставит закрывающую. Это касается и других парных символов, например, кавычек. О них — в будущих уроках.

Иногда выражение сложно воспринимать визуально. Тогда можно расставить скобки, не повлияв на приоритет. Код пишется для людей, а машины будут только исполнять его. Для машин код — или корректный, или не корректный. Для них нет «более» понятного или «менее» понятного кода. Явная расстановка приоритетов упрощает чтение кода другими разработчиками.

Задание

Дано вычисление 70 * 3 + 4 / 8 + 2 .

Расставьте скобки так, чтобы оба сложения ( 3 + 4 ) и ( 8 + 2 ) высчитывались в первую очередь. Выведите на экран результат.

Упражнение не проходит проверку — что делать? ��

Если вы зашли в тупик, то самое время задать вопрос в «Обсуждениях». Как правильно задать вопрос:

  • Обязательно приложите вывод тестов, без него практически невозможно понять что не так, даже если вы покажете свой код. Программисты плохо исполняют код в голове, но по полученной ошибке почти всегда понятно, куда смотреть.

В моей среде код работает, а здесь нет ��

Тесты устроены таким образом, что они проверяют решение разными способами и на разных данных. Часто решение работает с одними входными данными, но не работает с другими. Чтобы разобраться с этим моментом, изучите вкладку «Тесты» и внимательно посмотрите на вывод ошибок, в котором есть подсказки.

Мой код отличается от решения учителя ��

Это нормально ��, в программировании одну задачу можно выполнить множеством способов. Если ваш код прошел проверку, то он соответствует условиям задачи.

В редких случаях бывает, что решение подогнано под тесты, но это видно сразу.

Прочитал урок — ничего не понятно ��

Создавать обучающие материалы, понятные для всех без исключения, довольно сложно. Мы очень стараемся, но всегда есть что улучшать. Если вы встретили материал, который вам непонятен, опишите проблему в «Обсуждениях». Идеально, если вы сформулируете непонятные моменты в виде вопросов. Обычно нам нужно несколько дней для внесения правок.

Кстати, вы тоже можете участвовать в улучшении курсов: внизу есть ссылка на исходный код уроков, который можно править прямо из браузера.

Полезное

Приоритет оператора

Приоритет оператора определяет, насколько «тесно» он связывает между собой два выражения. Например, выражение 1 + 5 * 3 вычисляется как 16, а не 18, поскольку оператор умножения («*») имеет более высокий приоритет, чем оператор сложения («+»). Круглые скобки могут использоваться для принудительного указания порядка выполнения операторов. Например, выражение (1 + 5) * 3 вычисляется как 18.

Если операторы имеют равный приоритет, то их группирование определяется их ассоциативностью. Например «-» имеет левую ассоциативность, поэтому 1 — 2 — 3 группируется как (1 — 2) — 3 и равно -4. С другой стороны, «=» имеет правую ассоциативность, поэтому $a = $b = $c группируется как $a = ($b = $c).

Операторы с равным приоритетом, но не имеющие ассоциативность, не могут использоваться вслед друг за другом, например 1 < 2 >1 недопустимо в PHP. С другой стороны, выражение 1 вполне допустимо, так как оператор == имеет меньший приоритет чем оператор .

Используйте скобки, даже если они не обязательны. Чаще всего это повышает читаемость кода, непосредственно определяя порядок группировки, не полагаясь на конкретные приоритет или ассоциативность оператора.

В следующей таблице приведен список операторов, отсортированный по убыванию их приоритетов. Операторы, размещенные в одной строке имеют одинаковый приоритет и их группировка при выполнении определяется исходя из их ассоциативности.

Порядок выполнения операторов

Ассоциативность Оператор Дополнительная информация
неассоциативна clone new clone и new
левая [ array()
правая ** арифметика
правая ++ ~ (int) (float) (string) (array) (object) (bool) @ типы и инкремент/декремент
неассоциативна instanceof типы
правая ! логические операторы
левая * / % арифметические операторы
левая + . арифметические операторы и строковые операторы
левая >> побитовые операторы
неассоциативна > >= операторы сравнения
неассоциативна == != === !== <> операторы сравнения
левая & побитовые операторы и ссылки
левая ^ побитовые операторы
левая | побитовые операторы
левая && логические операторы
левая || логические операторы
левая ? : тернарный оператор
правая = += -= *= **= /= .= %= &= |= ^= <>>= => операторы присваивания
левая and логические операторы
левая xor логические операторы
левая or логические операторы
левая , множество применений

Пример #1 Ассоциативность

$a = 3 * 3 % 5 ; // (3 * 3) % 5 = 4
// ассоциативность тройного оператора отличается от C/C++
$a = true ? 0 : true ? 1 : 2 ; // (true ? 0 : true) ? 1 : 2 = 2

$a = 1 ;
$b = 2 ;
$a = $b += 3 ; // $a = ($b += 3) -> $a = 5, $b = 5
?>

приоритет и ассоциативность оператора определяет только группировку выражений, и не определяет порядок выполнения. PHP (в целом) не описывает в каком порядке выражение выполняется, и следует избегать код, опирающийся на порядок выполнения, так как поведение может меняться между версиями PHP в зависимости от окружающего кода.

Пример #2 Неизвестный порядок выполнения

$a = 1 ;
echo $a + $a ++; // может вывести и 2 и 3

$i = 1 ;
$array [ $i ] = $i ++; // может задать как индекс 1, так и 2
?>

Замечание:

Несмотря на то, что оператор = имеет низший приоритет, чем большинство остальных операторов, PHP все равно позволяет использовать следующую конструкцию: if (!$a = foo()), которая присваивает переменной $a результат выполнения функции foo().

PHP: Выражения и операторы

Выражение — это любая единица исходного кода программы, которая может быть вычислена для получения значения, например, вызов функции, использование операторов, или просто обращение к переменной по имени. В PHP почти всё является выражением.

Выражения делятся на простые (их также называют первичными) и сложные. Первичные выражения являются самостоятельными выражениями — они не включают в себя ещё более простых выражений. Например, к первичным выражениям относятся: идентификаторы, литералы и оператор группировки. Сложные выражения состоят из простых выражений. Типичный способ конструирования сложных выражений из простых выражений заключается в использовании операторов:

// Примеры первичных выражений 11 // Числовой литерал $str // Возвращает значение переменной [] // Литерал массива () // Оператора группировки // Примеры сложных выражений $alpha + 19 // Возвращает результат арифметической операции ($alpha - 37) * $beta / 2 // Возвращает результат арифметических операций foo() // Возвращает результат вызова функции $mass[1] // Возвращает значение элемента массива

Некоторые выражения, так же как и инструкции, оканчиваются точкой с запятой, например:

$a = 5;

Таким образом, разница между выражением и инструкцией заключается в том, что любое выражение — это то, что вычисляется для получения значения, а инструкция — это просто указание на совершение какого-либо действия.

Операторы

Оператор — это элемент программного кода, который описывает то или иное действие в выражении. В PHP оператор представляет собой символ, благодаря которому могут производиться различные виды вычислений, сравнений или присваиваний с участием одного или нескольких значений. Разные операторы отличаются типом и количеством операндов. В PHP используется несколько типов операторов: арифметические, присваивания, сравнения, логические и поразрядные (побитовые). Значения, расположенные по сторонам операторов, называются операндами:

3 + 4

Числовые литералы по обе стороны от оператора + являются его операндами. Операнд — это то, на что воздействует оператор. Операнды и операторы дают в результате выражение, которое формирует новое значение.

Из всего вышесказанного можно сделать вывод, что выражением называются два или больше подвыражений, объединенных операторами. Чем больше у вас подвыражений и операторов, тем длиннее и сложнее выражение.

При работе с операторами особое значение имеют следующие аспекты:

  • количество операндов
  • тип операндов
  • приоритет (порядок исполнения)
  • ассоциативность операторов

Количество операндов

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

Другие операторы могут принимать всего один операнд, они называются унарными . Примерами унарного оператора могут служить унарный минус (-), инкремент, декремент и т.д.

Существует также один оператор, который может работать с тремя операндами, такой оператор называется тернарный . Этим оператором является оператор, представляющий собой сокращенную форму записи условного оператора if, о котором мы поговорим позже, когда будем рассматривать условные операторы.

Типы операндов

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

'a' * 'b'

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

'10' * '10'

В этом выражении интерпретатор PHP автоматически преобразует строки в числа и перемножает их. Но иногда такое автоматическое преобразование невозможно, поэтому будьте внимательны и следите за используемыми типами операндов.

Примечание: Когда PHP выполняет автоматическое преобразование типа, это называется неявным приведением типа, если преобразование типа выполняется вручную — это называется явным приведением типа.

Приоритет

Приоритет оператора определяет порядок исполнения операций при вычислении значения выражения.

Операторы с одинаковым приоритетом обрабатываются в порядке следования в выражении. Например, операции умножения и деления исполняются в том порядке, в котором следуют в выражении, потому что они имеют одинаковый приоритет.

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

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

Ассоциативность

Все операторы обрабатывают свои операнды в определенном направлении. Направление обработки называется ассоциативностью и зависит от типа оператора. Большинство операторов выполняет обработку слева направо — такой порядок называется левой ассоциативностью. Левая ассоциативность подразумевает, что выражение вычисляется слева направо, правая ассоциативность — в обратном направлении.

Таблица операторов

В PHP есть несколько уровней приоритетов, в таблице приведен перечень операторов, отсортированных по уровню приоритета, от высшего к низшему. Операторы на одном уровне имеют одинаковый приоритет.

В колонке «Ассоциативность» помечены операторы, которые имеют правую ассоциативность, остальные относятся к левой.

Оператор Описание Ассоциативность
NEW Создает новый объект Справа налево
.
[]
()
Доступ к свойству (точечная нотация)
Индекс массива
Вызов функции
!
~
++, —
+, —
(int)
(float/double/real)
(string)
(array)
(object)
@
Логическое НЕ
Битовое НЕ
Операторы инкремента и декремента
Унарный плюс и минус
Оператор приведения типа
Оператор приведения типа
Оператор приведения типа
Оператор приведения типа
Оператор приведения типа
Подавление вывода сообщений об ошибках
Справа налево
*, /, % Умножение, деление
+, —
.
Сложение, вычитание
Конкатенация
> Битовый сдвиг
, >= Операторы сравнения
==, !=
===, !==, <>
Операторы сравнения
& Битовое И
ˆ Битовое ИЛИ-НЕ
| Битовое ИЛИ
&& Логическое И
|| Логическое ИЛИ
? : Условный (тернарный) оператор
=, +=, -=, *=, /=, .=, %=,
&=, |=, ^=, >=, =>
Операторы присваивания Справа налево
AND Логическое И
XOR Логическое ИЛИ-НЕ
OR Логическое ИЛИ
, Оператор запятая

С этой темой смотрят:

  • Присваивание
  • Арифметические операторы
  • Операторы сравнения
  • Логические операторы
  • Побитовые операторы

Копирование материалов с данного сайта возможно только с разрешения администрации сайта
и при указании прямой активной ссылки на источник.
2011 – 2023 © puzzleweb.ru | razumnikum.ru

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *