У меня есть кодовая база, где разработчики решили использовать AND
и OR
вместо &&
и ||
,
Я знаю, что существует разница в приоритете операторов ( &&
идет до and
), но с данной структурой (точнее, PrestaShop ) это явно не причина.
Какую версию вы используете? Является ли более читаемым, чем &&
? Или нет никакой разницы?
Если вы используете AND
и OR
, вы, в конце концов, столкнетесь с чем-то вроде этого:
$this = true; $that = false; $truthiness = $this and $that;
Хотите угадать, какая $truthiness
равна?
Если вы сказали, что false
… bzzzt, извините, неправильно!
$truthiness
выше имеет значение true
. Зачем? =
имеет более высокий приоритет, чем and
. Добавление круглых скобок для отображения неявного порядка делает это более ясным:
($truthiness = $this) and $that
Если вы использовали &&
вместо and
в первом примере кода, он будет работать как ожидалось и будет false
.
Как обсуждается в комментариях ниже, это также работает, чтобы получить правильное значение, поскольку круглые скобки имеют более высокий приоритет, чем =
:
$truthiness = ($this and $that)
В зависимости от того, как он используется, это может быть необходимо и даже удобно. http://php.net/manual/en/language.operators.logical.php
// "||" has a greater precedence than "or" // The result of the expression (false || true) is assigned to $e // Acts like: ($e = (false || true)) $e = false || true; // The constant false is assigned to $f and then true is ignored // Acts like: (($f = false) or true) $f = false or true;
Но в большинстве случаев это похоже на нечто большее, чем у разработчика, как и в каждом случае этого, что я видел в рамках CodeIgniter, например, @Sarfraz.
Приоритет отличается между && и и (&& имеет более высокий приоритет, чем и), что вызывает путаницу в сочетании с тройным оператором. Например,
$predA && $predB ? "foo" : "bar"
вернет строку, тогда как
$predA and $predB ? "foo" : "bar"
вернет логическое значение .
Так как and
имеет более низкий приоритет, чем =
вы можете использовать его при назначении условия:
if ($var = true && false) // Compare true with false and assign to $var if ($var = true and false) // Assign true to $var and compare $var to false
В целях безопасности я всегда заключу в скобки мои сравнения и освобождаю их. Таким образом, я не должен полагаться на приоритет оператора:
if( ((i==0) && (b==2)) || ((c==3) && !(f==5)) )
какую версию вы используете?
Если стандарты кодирования для конкретной кодовой базы, на которой я пишу код, указывают, какой оператор следует использовать, я определенно буду использовать это. Если нет, и код диктует, что следует использовать (не часто, можно легко обойти), то я буду использовать это. В противном случае, вероятно, &&
.
Является ли «и» более читаемым, чем «&&»?
Это более читаемо для вас . Ответ – да, и нет, в зависимости от многих факторов, включая код вокруг оператора и действительно человека, читающего его!
|| есть ~ разница?
Да. См. Логические операторы для ||
и побитовые операторы для ~
.
Я думаю, что это вопрос вкуса, хотя (по ошибке) их смешивание может вызвать некоторые нежелательные формы поведения:
true && false || false; // returns false true and false || false; // returns true
Следовательно, используя && и || безопаснее, поскольку они имеют наивысший приоритет. Что касается читаемости, я бы сказал, что эти операторы достаточно универсальны.
ОБНОВЛЕНИЕ : О комментариях, в которых говорится, что обе операции возвращают false … ну, на самом деле код выше ничего не возвращает, извините за двусмысленность. Чтобы уточнить: поведение во втором случае зависит от того, как используется результат операции. Наблюдайте за тем, как здесь играет роль приоритет операторов:
var_dump(true and false || false); // bool(false) $a = true and false || false; var_dump($a); // bool(true)
Причина, по которой $a === true
заключается в том, что оператор присваивания имеет приоритет над любым логическим оператором, что уже хорошо объяснено в других ответах.
Вот несколько примеров:
$a = true; $b = true; $c = $a & $b; var_dump(true === $c);
вывод:
bool(false)
Я бы сказал, что такая опечатка гораздо более вероятна, чтобы вызвать коварные проблемы (почти так же, как =
vs ==
), и гораздо реже будет замечено, чем опечатки adn
/ ro
которые будут отмечены как синтаксические ошибки. Я также нахожу и / или гораздо легче читать. FWIW, большинство фреймворков PHP, которые выражают предпочтение (большинство из них не указано), указывают и / или. Я также никогда не сталкивался с реальным, непродуманным случаем, когда это имело бы значение.
Позвольте мне объяснить разницу между «и» – «&&» – «&».
«&&» и «и» оба являются логическими операциями И, и они делают то же самое, но приоритет оператора отличается.
Приоритет (приоритет) оператора указывает, как «плотно» он связывает два выражения вместе. Например, в выражении 1 + 5 * 3 ответ равен 16, а не 18, потому что оператор умножения («*») имеет более высокий приоритет, чем оператор сложения («+»).
Смешивание их в единую операцию может дать неожиданные результаты, в некоторых случаях я рекомендую всегда использовать &&, но это ваш выбор.
С другой стороны, «&» является побитовой И-операции . Он используется для оценки и обработки конкретных бит в пределах целочисленного значения.
Пример, если вы это сделаете (14 и 7), результат будет 6.
7 = 0111 14 = 1110 ------------ = 0110 == 6