Приоритет логических операций php

Operator Precedence

Приоритет оператора определяет, насколько «тесно» он связывает два выражения вместе. Например, в выражении 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

Ассоциативность имеет смысл только для двоичных (и тернарных) операторов. Унарные операторы являются префиксными или постфиксными, поэтому это понятие не применимо. Например, !!$a можно сгруппировать только как !(!$a) .

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

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

Operator Precedence
Associativity Operators Additional Information
(n/a) clone new клон и новый
right ** arithmetic
(n/a) + — ++ — ~ (int) (float) (string) (array) (object) (bool) @ арифметика (унарные + и — ), инкремент / декремент , побитовое преобразование , приведение типов и контроль ошибок
left instanceof type
(n/a) ! logical
left * / % arithmetic
left + — . арифметика (двоичные + и — ), массив и строка ( . до PHP 8.0.0)
left > bitwise
left . строка (начиная с PHP 8.0.0)
non-associative < >= comparison
non-associative == != === !== <> comparison
left & побитовые и ссылки
left ^ bitwise
left | bitwise
left && logical
left || logical
right ?? null coalescing
non-associative ? : тернарный (левоассоциативный до PHP 8.0.0)
right = += -= *= **= /= .= %= &= |= ^= <>= ??= assignment
(n/a) yield from yield from
(n/a) yield yield
(n/a) print print
left and logical
left xor logical
left or logical

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

 $a = 3 * 3 % 5; // (3 * 3) % 5 = 4 // ternary operator associativity differs from C/C++ $a = true ? 0 : true ? 1 : 2; // (true ? 0 : true) ? 1 : 2 = 2 (prior to PHP 8.0.0) $a = 1; $b = 2; $a = $b += 3; // $a = ($b += 3) -> $a = 5, $b = 5 ?>

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

Пример # 2 Неопределенный порядок оценки

 $a = 1; echo $a + $a++; // may print either 2 or 3 $i = 1; $array[$i] = $i++; // may set either index 1 or 2 ?>

Пример №3 + , — и . имеют тот же приоритет (до PHP 8.0.0)

 $x = 4; // this line might result in unexpected output: echo "x minus one equals " . $x-1 . ", or so I hope\n"; // because it is evaluated like this line (prior to PHP 8.0.0): echo (("x minus one equals " . $x) - 1) . ", or so I hope\n"; // the desired precedence can be enforced by using parentheses: echo "x minus one equals " . ($x-1) . ", or so I hope\n"; ?>

Выводится приведенный выше пример:

-1, or so I hope -1, or so I hope x minus one equals 3, or so I hope

Note:

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

Changelog

Version Description
8.0.0 Объединение строк ( . ) Теперь имеет более низкий приоритет, чем арифметическое сложение / вычитание ( + и — ) и побитовый сдвиг влево / вправо ( > ); раньше он имел тот же приоритет, что и + и — , и более высокий приоритет, чем > .
8.0.0 Тернарный оператор ( ? : 🙂 Теперь неассоциативен; ранее он был левоассоциативным.
7.4.0 Не рекомендуется полагаться на приоритет конкатенации строк ( . ) Относительно арифметического сложения / вычитания ( + или — ) или побитового сдвига влево / вправо ( > ), т.е. использовать их вместе в выражении без скобок.
7.4.0 Не рекомендуется полагаться на левоассоциативность тернарного оператора ( ? : :), Т. Е. Вложение нескольких тернарных операторов без скобок.

Источник

Приоритет логических операций php

В PHP мы можем использовать различные операторы: арифметические, логические и т.д. Рассмотрим каждый тип операций.

Арифметические операции

  • + (операция сложения) Например, $a + 5
  • — (операция вычитания) Например, $a — 5
  • * (умножение) Например, $a * 5
  • / (деление) Например, $a / 5
  • % (получение остатка от деления) Например:
$a = 8 + 2; // 10, сложение $a = 8 - 2; // 6, вычитание $a = 8 * 2; // 16, умножение $a = 8 / 2; // 4, деление $a = 8 % 2; // 0, деление по модулю $a = 8 ** 2; // 64, возведение в степень

Инкремент и декремент

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

Инкремент — операция ++ увеличивает число на единицу. Например, ++$a

Есть два типа инкремента: префиксный инкремент ( ++$a ) и постфиксный ( $a++ ). Важно понимать разницу между этими операциями. Рассмотрим сначала префиксный инкремент:

$a = 12; $b = ++$a; // $b равно 13 echo "a = $a b = $b";

Здесь сначала к значению переменной $a прибавляется единица, а затем ее значение приравнивается переменной $b.

Теперь посмотрим, что будет в случае с постфиксным инкрементом:

$a = 12; $b = $a++; // $b равно 12 echo "a = $a b = $b";

Здесь сначала значение переменной $a передается переменной $b, а затем происходило увеличение значения переменной $a.

Декремент — операция — представляет уменьшение значения на единицу. Она аналогично инкременту бывает префиксной и постфиксной и работает аналогично. Например, префиксный декремент:

$a = 12; $b = --$a; // $b равно 11 echo "a = $a b = $b";

Сначала значение переменной $a уменьшается на единицу, а затем ее значение приравнивается переменной $b.

$a = 12; $b = $a--; // $b равно 12 echo "a = $a b = $b";

Здесь же сначала значение переменной $a передается переменной $b и только после этого уменьшается на единицу.

Объединение строк

Для объединения строк используется оператор «точка». Например, соединим несколько строк:

$a="Привет, "; $b=" мир"; echo $a . " " . $b . "!"; // Привет мир!

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

Операции сравнения

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

  • == Оператор равенства сравнивает два значения, и если они равны, возвращает true, иначе возвращает false: $a == 5
  • === Оператор тождественности также сравнивает два значения, и если они равны, возвращает true, иначе возвращает false: $a === 5
  • != Сравнивает два значения, и если они не равны, возвращает true, иначе возвращает false: $a != 5
  • !== Сравнивает два значения, и если они не равны, возвращает true, иначе возвращает false: $a !== 5
  • > Сравнивает два значения, и если первое больше второго, то возвращает true, иначе возвращает false: $a > 5
  • < Сравнивает два значения, и если первое меньше второго, то возвращает true, иначе возвращает false: $a < 5
  • >= Сравнивает два значения, и если первое больше или равно второму, то возвращает true, иначе возвращает false: $a >= 5

Оператор равенства и тождественности

Оба оператора сравнивают два выражения и возвращают true, если выражения равны. Но между ними есть различия. Если в операции равенства принимают два значения разных типов, то они приводятся к одному — тому, который интерпретатор найдет оптимальным. Например:

$a = (2 == "2"); // true (значения равны) $b = (2 === "2"); // false (значения представляют разные типы)

Строка «2» по сути представляет то же значение, что и число 2, оператор сравнения возвратит true . Однако они представляют разные типы, поэтому оператор тождественности возвратит false

Аналогично работают операторы неравенства != и !== .

$a = (2 != "2"); // false, так как значения равны $b = (2 !== "2"); // true, так как значения представляют разные типы

Оператор

  • 0, если оба значения равны
  • 1, если значение слева больше, чем значение справа
  • –1, если значение слева меньше, чем значение справа
$a = 2 2; // 0 (эквивалентно 2 == 2) $b = 3 2; // 1 (эквивалентно 3 > 2) $c = 1 2; // -1 (эквивалентно 1 < 2) echo "a=$a b=$b c=$c"; // a=0 b=1 c=-1

Логические операции

Логические операции обычно применяются для объединения результатов двух операций сравнения. Например, нам надо выполнить определенное действие, если истинны будут несколько условий. Имеются следующие логические операции:

  • && Возвращает true, если обе операции сравнения возвращают true, иначе возвращает false: $a && $b
  • and Аналогично операции && : $a and $b
  • || Возвращает true, если хотя бы одна операция сравнения возвращают true, иначе возвращает false: $a || $b
  • or Аналогично операции || : $a or $b
  • ! Возвращает true, если операция сравнения возвращает false: !$a
  • xor Возвращает true, если только одно из значений равно true. Если оба равны true или ни одно из них не равно true, возвращает false: $a xor $b

Примеры логических операций:

$a = (true && false); // false // аналогично $a = (true and false); // false $b = (true || false); // true // аналогично следующей операции $b = (true or false); // true $c = !true; // false

Отдельно примеры с операцией xor :

$a = (true xor true); // false $b = (false xor true); // true $c = (false xor false); // false

Поразрядные операции

Поразрядные операции производятся над отдельными разрядными или битами числа. Числа рассматриваются в двоичном представлении, например, 2 в двоичном представлении 010, число 7 - 111.

    & (логическое умножение) Умножение производится поразрядно, и если у обоих операндов значения разрядов равно 1, то операция возвращает 1, иначе возвращается число 0. Например:

$a = 4; //100 $b = 5; //101 echo $a & $b; // равно 4 - 100
$a = 4; //100 $b = 5; //101 echo $a | $b; // равно 5 - 101
$a = 5 ^ 4; // 101^100=001 - в десятичой системе 1 $b = 7 ^ 4; // 111^100=011 - в десятичой системе 3
$a = 4; //00000100 $b = ~$a; //11111011 -5 echo $b; // равно -5

Операции присваивания

  • = Приравнивает переменной определенное значение: $a = 5
  • += Сложение с последующим присвоением результата. Например:
$a=12; $a += 5; echo $a; // равно 17
$a=12; $a *= 5; echo $a; // равно 60
$a=12; $a /= 5; echo $a; // равно 2.4
$a=12; $a .= 5; echo $a; // равно 125 // идентично $b="12"; $b .="5"; // равно 125
$a=8; $a **= 2; echo $a; // равно 64 (8 в степени 2)

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

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

Приоритет операций можно описать следующей таблицей:

Источник

Читайте также:  Char types in cpp
Оцените статью