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

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

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

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

Ответ 1

Если вы используете 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)

Ответ 2

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

Ответ 3

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

if( 
    ((i==0) && (b==2)) 
    || 
    ((c==3) && !(f==5)) 
  )

Ответ 4

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

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

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

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

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

Ответ 5

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

Ответ 6

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

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

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

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

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

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

Ответ 7

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

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

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

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


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

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

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

Ответ 8

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

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

Ответ 9

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

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

выход:

bool(false)

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

Ответ 10

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

Ответ 11

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

Ответ 12

Я много пишу на PHP и Javascript. "И" помогает мне вспомнить, на каком языке я пишу!