'И' vs '& & ' как оператор
у меня есть тексты, где разработчики решили использовать AND
и OR
вместо &&
и ||
.
Я знаю, что существует разница в приоритете операторов (&&
идет перед and
), но с заданной структурой (тема если быть точным) это явно не причина.
какую версию вы используете? Is and
более читабельным, чем &&
? Или нет никакой разницы?
11 ответов
если вы используете 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)
в зависимости от того, как он используется, это может быть необходимо и даже удобно. 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 framework, как @ Sarfraz упомянул.
С 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
для безопасности, я всегда parenthesise мои сравнения и пространство их. Таким образом, мне не нужно полагаться на приоритет оператора:
if(
((i==0) && (b==2))
||
((c==3) && !(f==5))
)
приоритет отличается между && и и (&&имеет более высокий приоритет, чем и), что вызывает путаницу в сочетании с тернарным оператором. Например,
$predA && $predB ? "foo" : "bar"
вернет строка, тогда как
$predA and $predB ? "foo" : "bar"
вернет boolean.
какую версию вы используете?
если стандарты кодирования для конкретной кодовой базы, для которой я пишу код, определяют, какой оператор должен использоваться, я буду наверняка использовать. Если нет, то и код диктат который следует использовать (не часто, можно легко обойти), тогда я буду использовать это. В противном случае, наверное &&
.
является ли " и "более читаемым, чем"&&"?
Is это более читаемый вам. Ответ да и нет в зависимости от многих факторов, включая код оператора и вообще человек, читающий это!
|| есть ~ разница?
да. См.логические операторы на ||
и побитовые операторы на ~
.
позвольте мне объяснить разницу между "и" - "&&" - "&".
"&&" и "и" оба логические и операции и они делают то же самое, но приоритет операторов разная.
приоритет (приоритет) оператора определяет, насколько "тесно" он связывает между собой два выражения. Например, в выражении 1 + 5 * 3, Ответ 16, а не 18, потому что оператор умножения ("*") имеет более высокий приоритет, чем оператор сложения ("+").
смешивая их вместе в одной операции, может дать вам неожиданные результаты в некоторых случаях Я рекомендую всегда использовать &&, но это ваш выбор.
С другой стороны, " & " - это побитовые операции. Он используется для оценки и манипулирования конкретными битами в целочисленном значении.
пример если вы это сделаете (14 & 7), результат будет 6.
7 = 0111
14 = 1110
------------
= 0110 == 6
Я думаю, это вопрос вкуса, хотя (ошибочно) смешивание их может вызвать некоторые нежелательные поведения:
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, которые выражают предпочтение (большинство не), указывают и / или. Я также никогда не сталкивался с реальным, не надуманным случай, когда это имело бы значение.
в зависимости от языка, который вы используете, как правило, лучше использовать
&&
и||
, а неand
иor
, за исключением таких языков, как Python, гдеand
иor
используются вместо и&&
и||
отсутствуют.
еще один хороший пример использования 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 для En подробный пример.