'AND' vs '&&' как оператор - PullRequest
       119

'AND' vs '&&' как оператор

276 голосов
/ 10 мая 2010

У меня есть кодовая база, где разработчики решили использовать AND и OR вместо && и ||.

Я знаю, что есть различие в приоритетах операторов (&& идет перед and), но с данной структурой ( PrestaShop , если быть точным) это явно не причина.

Какую версию вы используете? and более читабельно, чем &&? Или нет разницы?

Ответы [ 11 ]

622 голосов
/ 10 мая 2010

Если вы используете 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)
42 голосов
/ 10 мая 2010

В зависимости от того, как это используется, это может быть необходимо и даже удобно.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.

10 голосов
/ 13 ноября 2012

В целях безопасности я всегда заключаю в скобки свои сравнения и выделяю их.Таким образом, мне не нужно полагаться на приоритет оператора:

if( 
    ((i==0) && (b==2)) 
    || 
    ((c==3) && !(f==5)) 
  )
9 голосов
/ 08 августа 2012

Приоритет отличается между && и и (&& имеет более высокий приоритет, чем и), что вызывает путаницу в сочетании с троичным оператором. Например,

$predA && $predB ? "foo" : "bar"

вернет строку , тогда как

$predA and $predB ? "foo" : "bar"

вернет логическое значение .

8 голосов
/ 08 января 2016

Поскольку 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
1 голос
/ 23 ноября 2017

Позвольте мне объяснить разницу между «и» - «&&» - «&».

"&&" и "and" оба являются логическими операциями AND и они делают то же самое, но приоритет оператора отличается.

Приоритет (приоритет) оператора указывает, насколько «тесно» он связывает два выражения вместе. Например, в выражении 1 + 5 * 3 ответом является 16, а не 18, поскольку оператор умножения ("*") имеет более высокий приоритет, чем оператор сложения ("+").

Смешивание их в одну операцию может привести к неожиданным результатам в некоторых случаях Я рекомендую всегда использовать &&, но это ваш выбор.


С другой стороны, "&" - это побитовая операция И . Он используется для оценки и обработки определенных битов в целочисленном значении.

Например, если вы сделаете (14 и 7), результат будет 6.

7   = 0111
14  = 1110
------------
    = 0110 == 6
1 голос
/ 10 мая 2010

какую версию вы используете?

Если стандарты кодирования для конкретной кодовой базы, для которой я пишу код, указывают, какой оператор следует использовать, я определенно буду использовать это. Если нет, а код диктует , который следует использовать (не часто, можно легко обойти), тогда я воспользуюсь этим. В противном случае вероятно &&.

Является ли 'и' более читабельным, чем '&&'?

Это более читабельно для вас . Ответ да и нет в зависимости от многих факторов, включая код оператора и человека, который его читает!

|| есть разница?

Да. См. логические операторы для || и битовые операторы для ~.

0 голосов
/ 19 июля 2018

Еще один хороший пример использования операторов 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 для подробного примера.

0 голосов
/ 01 января 2018

В зависимости от языка, который вы используете, обычно лучше использовать && и || вместо and и or, за исключением языков, таких как Python, где and и or вместо этого используются && и ||.

0 голосов
/ 26 июня 2017

Вот небольшой контрпример:

$a = true;
$b = true;
$c = $a & $b;
var_dump(true === $c);

выход:

bool(false)

Я бы сказал, что этот тип опечатки с гораздо большей вероятностью может вызвать коварные проблемы (во многом аналогично = против ==) и гораздо менее вероятно, что его заметят, чем adn / ro опечатки, которые будут помечены как синтаксические ошибки. Я также нахожу и / или гораздо легче читать. FWIW, большинство фреймворков PHP, которые выражают предпочтения (большинство не), указывают и / или. Я также никогда не сталкивался с реальным, не выдуманным делом, где это имело бы значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...