'И' 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 подробный пример.