У меня есть кодовая база, где разработчики решили использовать AND
и OR
вместо &&
и ||
.
Я знаю, что есть различие в приоритетах операторов ( &&
идет раньше and
), но с данной структурой ( если быть точным, PrestaShop ) это явно не причина.
Какую версию вы используете? Это and
более читабельно, чем &&
? Или нет разницы?
~
это побитовый оператор НЕ, а не логический. ;-)Ответы:
Если вы используете
AND
иOR
, вы в конечном итоге получите что-то вроде этого:Хотите угадать, что
$truthiness
равно?Если вы сказали
false
... bzzzt, извините, неправильно!$truthiness
выше имеет значениеtrue
. Зачем?=
имеет более высокий приоритет, чемand
. Добавление скобок для отображения неявного порядка делает это более понятным:Если вы используете
&&
вместоand
первого примера кода, он будет работать как положено и будетfalse
.Как обсуждалось в комментариях ниже, это также работает для получения правильного значения, так как скобки имеют более высокий приоритет, чем
=
:источник
and
or
раз и навсегда. Я видел слишком много людей, думающих, что они абсолютно одно и то же, и ответы здесь - больше свидетельств.$foo and bar()
, которые являются хорошими ярлыками для операторов if. Если неожиданное поведение (из-за плохой документации или не чтения) было причиной не использовать то, о чем мы вообще не будем говорить об использовании PHP.В зависимости от того, как он используется, это может быть необходимо и даже удобно. http://php.net/manual/en/language.operators.logical.php
Но в большинстве случаев это больше похоже на вкус разработчика, как на каждое вхождение этого, которое я видел в платформе CodeIgniter, как упомянул @Sarfraz.
источник
if ($f = false or true) $f = true;
- в конечном итоге результат$f
станет истинным, поскольку выражение в целом оценивается как истинное.$f
присваивается значение false, но условие оценивается как true, а затем$f
перезаписывается. Если условие оценивается как ложное,$f
оно никогда не будет перезаписано в любом случае.and
более&&
, гдеand
работает , как ожидается , лишь в некоторых ситуациях и&&
работ , как ожидается , во всех ситуации.В целях безопасности я всегда заключаю в скобки свои сравнения и выделяю их. Таким образом, мне не нужно полагаться на приоритет оператора:
источник
Приоритеты различаются между && и и (&& имеет более высокий приоритет, чем и), что вызывает путаницу в сочетании с троичным оператором. Например,
вернет строку, тогда как
вернет логическое значение .
источник
Так как
and
имеет более низкий приоритет, чем=
вы можете использовать его при назначении условий:источник
«&&» и «and» оба являются логическими операциями AND, и они выполняют одно и то же, но приоритет оператора различен.
Приоритет (приоритет) оператора указывает, насколько «тесно» он связывает два выражения вместе. Например, в выражении 1 + 5 * 3 ответом является 16, а не 18, поскольку оператор умножения ("*") имеет более высокий приоритет, чем оператор сложения ("+").
Смешивание их в одну операцию может привести к неожиданным результатам, в некоторых случаях я рекомендую всегда использовать &&, но это ваш выбор.
С другой стороны , «&» является побитовой операцией И . Он используется для оценки и манипулирования конкретными битами в пределах целочисленного значения.
Например, если вы делаете (14 и 7), результат будет 6.
источник
Если стандарты кодирования для конкретной кодовой базы, для которой я пишу код, определяют, какой оператор следует использовать, я определенно буду это использовать. Если нет, а код диктует, какой должен быть использован (не часто, его легко можно обойти), тогда я воспользуюсь этим. В противном случае, вероятно
&&
.Это более читабельно для вас . Ответ - да и нет, в зависимости от многих факторов, включая код оператора и человека, который его читает!
Да. Смотрите логические операторы для
||
и побитовые операторы для~
.источник
Я предполагаю, что это дело вкуса, хотя (ошибочно) их смешивание может вызвать некоторые нежелательные поведения:
Следовательно, используя && и || безопаснее, потому что они имеют высший приоритет. Что касается читабельности, я бы сказал, что эти операторы достаточно универсальны.
ОБНОВЛЕНИЕ : О комментариях, говорящих о том, что обе операции возвращают false ... ну, фактически, приведенный выше код ничего не возвращает, извините за двусмысленность. Для уточнения: поведение во втором случае зависит от того, как используется результат операции. Посмотрите, как приоритет операторов вступает в игру здесь:
Причина в том
$a === true
, что оператор присваивания имеет приоритет над любым логическим оператором, как уже очень хорошо объяснено в других ответах.источник
Вот небольшой контрпример:
вывод:
Я бы сказал, что такого рода опечатка с гораздо большей вероятностью может привести к коварным проблемам (во многом так же, как и к
=
vs==
) и с гораздо меньшей вероятностью будет замечена, чемadn
/ro
опечатки, которые будут помечены как синтаксические ошибки. Я также нахожу и / или гораздо легче читать. FWIW, большинство фреймворков PHP, которые выражают предпочтение (большинство не), задают и / или. Я также никогда не сталкивался с реальным, необдуманным случаем, где это имело бы значение.источник
Еще один хороший пример использования
if
операторов без=
операций присваивания.и
потому что
AND
имеет более низкий приоритет и, следовательно,||
более высокий приоритет.Они разные в случаях
true, false, false
иtrue, true, false
. См. Https://ideone.com/lsqovs для подробного примера.источник