Приоритет математических операций в 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
?php
$a = 1 ;
$b = 2 ;
$a = $b += 3 ; // $a = ($b += 3) -> $a = 5, $b = 5
?>
приоритет и ассоциативность оператора определяет только группировку выражений, и не определяет порядок выполнения. PHP (в целом) не описывает в каком порядке выражение выполняется, и следует избегать код, опирающийся на порядок выполнения, так как поведение может меняться между версиями PHP в зависимости от окружающего кода.
Пример #2 Неизвестный порядок выполнения
$a = 1 ;
echo $a + $a ++; // может вывести и 2 и 3
?php
$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