'AND' vs '&&' как оператор
У меня есть кодовая база, где разработчики решили использовать AND
и OR
вместо &&
и ||
.
Я знаю, что существует разница в приоритете операторов (&&
идет до AND
), но с данной структурой (PrestaShop если быть точным), это явно не причина.
Какую версию вы используете? Является ли AND
более читаемым, чем &&
? Или нет разницы?
Ответы
Ответ 1
Если вы используете AND
и OR
, вы, в конце концов, столкнетесь с чем-то вроде этого:
$this_one = true;
$that = false;
$truthiness = $this_one and $that;
Хотите угадать, какая $truthiness
равна?
Если вы сказали, что false
... bzzzt, извините, неправильно!
$truthiness
выше имеет значение true
. Зачем? =
имеет более высокий приоритет, чем and
. Добавление круглых скобок для отображения неявного порядка делает это более ясным:
($truthiness = $this_one) and $that
Если вы использовали &&
вместо and
в первом примере кода, он будет работать как ожидалось и будет false
.
Как обсуждается в комментариях ниже, это также работает, чтобы получить правильное значение, поскольку круглые скобки имеют более высокий приоритет, чем =
:
$truthiness = ($this_one and $that)
Ответ 2
В зависимости от того, как он используется, он может оказаться необходимым и даже удобным.
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.
Ответ 3
В целях безопасности я всегда заключу в скобки мои сравнения и выкладываю их. Таким образом, мне не нужно полагаться на приоритет оператора:
if(
((i==0) && (b==2))
||
((c==3) && !(f==5))
)
Ответ 4
Приоритет отличается от && и (& & имеет более высокий приоритет, чем и), что вызывает путаницу в сочетании с тройным оператором. Например,
$predA && $predB ? "foo" : "bar"
вернет строку, а
$predA and $predB ? "foo" : "bar"
вернет логическое значение.
Ответ 5
Так как 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
Ответ 6
какую версию вы используете?
Если стандарты кодирования для конкретной кодовой базы, на которой я пишу код, указывают, какой оператор следует использовать, я определенно буду использовать это. Если нет, и код диктует, что следует использовать (не часто, можно легко обойти), то я буду использовать это. В противном случае, возможно, &&
.
Является ли "и" более читаемым, чем "& &"?
Это более читаемо для вас. Ответ "да" и "нет" зависит от многих факторов, включая код вокруг оператора и даже человека, читающего его!
|| есть ~ разница?
Да. Смотрите логические операторы для ||
и побитовые операторы для ~
.
Ответ 7
Позвольте мне объяснить разницу между "и" - "& &" - "&".
"& &" и "и" оба являются логическими операциями AND, и они делают то же самое, но приоритет оператора отличается.
Приоритет (приоритет) оператора указывает, как "плотно" он связывает два выражения вместе. Например, в выражении 1 + 5 * 3 ответ равен 16, а не 18, потому что оператор умножения ( "*" ) имеет более высокий приоритет, чем оператор сложения ( "+" ).
Смешивание их в единую операцию может привести к неожиданным результатам в некоторых случаях
Я рекомендую всегда использовать & &, но это ваш выбор.
С другой стороны, "&" это операция побитового И. Он используется для оценки и обработки конкретных бит в пределах целочисленного значения.
Пример, если вы делаете (14 и 7), результат будет 6.
7 = 0111
14 = 1110
------------
= 0110 == 6
Ответ 8
Я думаю, это вопрос вкуса, хотя (по ошибке) их смешивание может вызвать некоторые нежелательные формы поведения:
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
заключается в том, что оператор присваивания имеет приоритет над любым логическим оператором, как это уже хорошо объяснено в других ответах.
Ответ 9
Вот несколько примеров:
$a = true;
$b = true;
$c = $a & $b;
var_dump(true === $c);
выход:
bool(false)
Я бы сказал, что такая опечатка гораздо более вероятна, чтобы вызвать коварные проблемы (почти так же, как =
vs ==
), и гораздо реже будет замечено, чем adn
/ro
опечатки, которые будут отображаться как синтаксические ошибки. Я также нахожу и/или гораздо легче читать. FWIW, большинство фреймворков PHP, которые выражают предпочтение (большинство из них не указано), указывают и/или. Я также никогда не сталкивался с реальным, непродуманным случаем, когда это имело бы значение.
Ответ 10
В зависимости от языка, который вы используете, обычно лучше использовать &&
и ||
а не and
и /or
, за исключением языков, таких как Python, где and
и /or
используются, а &&
и ||
не существует.
Ответ 11
Еще один приятный пример использования операторов if
без =
присваивания.
if (true || true && false); // is the same as:
if (true || (true && false)); // TRUE
а также
if (true || true AND false); // is the same as:
if ((true || true) && false); // FALSE
потому что AND
имеет более низкий приоритет и, следовательно, ||
более высокий приоритет.
Они различны в случаях true, false, false
и true, true, false
. См. Https://ideone.com/lsqovs для подробного примера.
Ответ 12
Я много пишу на PHP и Javascript. "И" помогает мне вспомнить, на каком языке я пишу!