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

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

Посмотрите внимательно на выражение 2 + 2 * 2 и посчитайте в уме ответ.

Правильный ответ: 6 .

Если у вас получилось 8 , то этот урок для вас. В школьной математике мы изучали понятие «приоритет операции». Приоритет определяет то, в какой последовательности должны выполняться операции. Например, умножение и деление имеют больший приоритет, чем сложение и вычитание, а приоритет возведения в степень выше всех остальных арифметических операций: 2 ** 3 * 2 вычислится в 16 .

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

Скобки можно ставить вокруг любой операции. Они могут вкладываться друг в друга сколько угодно раз. Вот пара примеров:

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

Иногда выражение сложно воспринимать визуально. Тогда можно расставить скобки, не повлияв на приоритет. Например, задание из прошлого урока можно сделать немного понятнее, если расставить скобки.

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

Задание

Дано вычисление 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 <= 1 == 1 вполне допустимо, так как оператор == имеет меньший приоритет чем оператор <=.

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

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

<?php
$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 Неизвестный порядок выполнения

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

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

Замечание:

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

Сообщество PHP-программистов

Сообщество из людей, которые программируют сайты и веб-приложения на PHP. Сборник уроков, классов и статей по PHP, MySQLi, ООП, PHP-фреймворкам, CMS и др.

Администратор

Владислав Гриценко

Теги записей

Спонсор

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

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

Приоритет оператора указывает интерпретатору, как "тесно" он связывает между собой две части выражения. Например, выражение 2 + 4 * 5 вычисляется как 22, а не 30, потому что оператор умножения ("*") имеет более высокий приоритет, чем оператор сложения ("+"). Но Вы можете использовать круглые скобки для принудительного указания более высокого приоритета оператору. Например, выражение (2 + 4) * 5 вычисляется как 30.

Когда несколько операторов имеют равные приоритеты, тогда в ход идет их ассоциативность. Например "+" имеет левую ассоциативность, поэтому 1 + 2 + 3 будет выполнено как (1 + 2) + 3. А оператор " line-height: 22.4px;">$a = $b = $c группируется как $a = ($b = $c).

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

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

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

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

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