У меня есть кодовая база, где разработчики решили использовать AND
и OR
вместо &&
и ||
.
Я знаю, что существует различие в приоритете операторов (&&
идет прежде and
), но с данной платформой (PrestaShop, чтобы быть точным) это - ясно не причина.
Какую версию Вы используете? and
более читаемый, чем &&
? Или нет ли никакое различие?
Если вы используете И
и ИЛИ
, вы в конечном итоге столкнетесь с чем-то вроде этого:
$this_one = true;
$that = false;
$truthiness = $this_one and $that;
Хотите угадать, чему равняется $ истинность
?
Если вы сказали ложь
... бзззт, извините, неверно!
$ истинность
выше имеет значение истина
. Почему? =
имеет более высокий приоритет , чем и
. Добавление круглых скобок, чтобы показать неявный порядок, делает это более понятным:
($truthiness = $this_one) and $that
Если вы использовали &&
вместо и
в первом примере кода, он будет работать так, как ожидалось, и будет ] ложь
.
Как обсуждается в комментариях ниже, это также работает для получения правильного значения, поскольку скобки имеют более высокий приоритет, чем =
:
$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, о которой упоминал @Sarfraz.
какую версию вы используете?
Если в стандартах кодирования для конкретной кодовой базы, для которой я пишу код, указано, какой оператор должен использоваться, я обязательно использую его. Если нет, и код диктует, какой оператор следует использовать (не часто, можно легко обойти), то я буду использовать его. Otherwise, probably &&
.
Является ли 'and' более читабельным, чем '&&'?
Является ли оно более читабельным для вас. Ответ да и нет зависит от многих факторов, включая код вокруг оператора и человека, который его читает!
|| есть ~ разница?
Да. Смотрите логические операторы для ||
и битовые операторы для ~
.
Думаю, это дело вкуса, хотя (ошибочное) смешивание этих операторов может вызвать нежелательное поведение:
true && false || false; // returns false
true and false || false; // returns true
Следовательно, использование && и || безопаснее, поскольку они имеют наивысший приоритет. Что касается читабельности, я бы сказал, что эти операторы достаточно универсальны.
UPDATE: В комментариях говорится, что обе операции возвращают false... ну, на самом деле приведенный выше код ничего не возвращает, извините за двусмысленность. Поясню: поведение во втором случае зависит от того, как используется результат операции. Обратите внимание, как здесь вступает в игру старшинство операторов:
var_dump(true and false || false); // bool(false)
$a = true and false || false; var_dump($a); // bool(true)
Причина, по которой $a === true
, заключается в том, что оператор присваивания имеет приоритет над любым логическим оператором, как уже очень хорошо объяснялось в других ответах.