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

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

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

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

    Если вы используете AND и OR , вы, в конце концов, столкнетесь с чем-то вроде этого:

     $this = true; $that = false; $truthiness = $this and $that; 

    Хотите угадать, какая $truthiness равна?

    Если вы сказали, что false … bzzzt, извините, неправильно!

    $truthiness выше имеет значение true . Зачем? = имеет более высокий приоритет, чем and . Добавление круглых скобок для отображения неявного порядка делает это более ясным:

     ($truthiness = $this) and $that 

    Если вы использовали && вместо and в первом примере кода, он будет работать как ожидалось и будет false .

    Как обсуждается в комментариях ниже, это также работает, чтобы получить правильное значение, поскольку круглые скобки имеют более высокий приоритет, чем = :

     $truthiness = ($this 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.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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