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

244

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

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

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

  • 1
    Обратите внимание, что ~ это побитовый оператор НЕ, а не логический. ;-)
  • 2
    Да, я знаю. Плохие привычки :) . Немного странно, что в PHP есть «и», «или» и «xor», но нет «нет», не так ли?
Показать ещё 6 комментариев
Теги:
operators
coding-style

11 ответов

560
Лучший ответ

Если вы используете 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)
  • 122
    +1: это следует сделать громко и ясно в документации PHP, или PHP должен измениться и дать одинаковый приоритет этим операторам или DEPRECATE and or один раз для всех. Я видел слишком много людей, думающих, что они абсолютно одно и то же, и ответы здесь - больше свидетельств.
  • 10
    На самом деле, другие языки (например, Perl и Ruby) также имеют эти варианты с одинаковым различием приоритетов, поэтому было бы неразумно отступать от этого стандарта (как бы странно это ни было для новичков), делая приоритет в PHP равным. Не говоря уже о обратной совместимости множества PHP-приложений.
Показать ещё 15 комментариев
40

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

  • 2
    Стоит отметить, что «true» не игнорируется, если это выражение является частью более крупного выражения. Рассмотрим случай, if ($f = false or true) $f = true; - результатом будет то, что $f в конце концов станет истинным, потому что выражение в целом оценивается как истинное.
  • 1
    нет, вы просто переписали переменную позже. выражение по-прежнему оценивается как ложное, затем вы перезаписали его значением true в следующей строке.
Показать ещё 2 комментария
9

Так как 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
8

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

if( 
    ((i==0) && (b==2)) 
    || 
    ((c==3) && !(f==5)) 
  )
  • 4
    Очень безопасно. Хорошо.
  • 26
    Лично я думаю, что добавление лишних лишних скобок делает чтение более запутанным, чем просто то, что вам нужно. Например, я думаю, что это намного легче читать: если (($ i == 0 && $ b == 2) || ($ c == 3 && $ f! = 5))
Показать ещё 6 комментариев
7

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

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

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

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

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

1

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

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

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

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


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

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

7   = 0111
14  = 1110
------------
    = 0110 == 6
1

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

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

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

Это более читаемо для вас. Ответ "да" и "нет" зависит от многих факторов, включая код вокруг оператора и даже человека, читающего его!

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

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

0

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

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

0

Вот несколько примеров:

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

выход:

bool(false)

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

0

Я думаю, это вопрос вкуса, хотя (по ошибке) их смешивание может вызвать некоторые нежелательные формы поведения:

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

  • 15
    Это не правда, они все возвращают ложь.
  • 1
    -1 Я думаю, что @Джей прав.
Сообщество Overcoder
Наверх
Меню