Eu tenho uma base de código onde os desenvolvedores decidiram usar AND
e em OR
vez de &&
e ||
.
Eu sei que há uma diferença na precedência dos operadores ( &&
vai antes and
), mas com a estrutura fornecida ( PrestaShop para ser preciso) claramente não é uma razão.
Qual versão você está usando? É and
mais legível do que &&
? Ou não há diferença?
~
é o operador NOT bit a bit e não o lógico. ;-)Respostas:
Se você usar
AND
eOR
, eventualmente, será enganado por algo assim:Quer adivinhar o que
$truthiness
é igual?Se você disse
false
... bzzzt, desculpe, errado!$truthiness
acima tem o valortrue
. Por quê?=
tem uma precedência mais alta queand
. A adição de parênteses para mostrar a ordem implícita torna isso mais claro:Se você usasse no
&&
lugar doand
primeiro exemplo de código, ele funcionaria como esperado e estaráfalse
.Conforme discutido nos comentários abaixo, isso também funciona para obter o valor correto, pois os parênteses têm maior precedência do que
=
:fonte
and
or
uma vez por todas. Vi muitas pessoas pensando que são exatamente a mesma coisa e as respostas aqui são mais depoimentos.$foo and bar()
, que são bons atalhos para instruções if. Se o comportamento inesperado (devido a documentação incorreta ou não a leitura) fosse um motivo para não usar algo que não estaríamos falando sobre o uso do PHP.Dependendo de como está sendo usado, pode ser necessário e até útil. http://php.net/manual/en/language.operators.logical.php
Mas na maioria dos casos, parece mais um gosto do desenvolvedor, como todas as ocorrências disso que eu já vi no framework CodeIgniter, como o @Sarfraz mencionou.
fonte
if ($f = false or true) $f = true;
- o resultado seria que$f
se torne verdadeiro no final, porque a expressão é avaliada como verdadeira em geral.$f
é atribuído false - mas a condição é avaliada como true, então$f
é substituída. Se a condição$f
fosse avaliada como falsa, nunca seria substituída de qualquer maneira.and
mais&&
, ondeand
funciona como esperado apenas em algumas situações e&&
funciona como esperado em todos situações.Por questões de segurança, sempre coloco parênteses em minhas comparações e as espaço. Dessa forma, não preciso confiar na precedência do operador:
fonte
A precedência difere entre && e e (&& tem maior precedência que e), algo que causa confusão quando combinado com um operador ternário. Por exemplo,
retornará uma string enquanto
retornará um booleano .
fonte
Como
and
tem precedência menor do que=
você pode usá-lo na atribuição de condições:fonte
"&&" e "e" são operações AND lógicas e fazem a mesma coisa, mas a precedência do operador é diferente.
A precedência (prioridade) de um operador especifica quão "firmemente" ele liga duas expressões. Por exemplo, na expressão 1 + 5 * 3, a resposta é 16 e não 18 porque o operador de multiplicação ("*") tem uma precedência mais alta que o operador de adição ("+").
Misturá-los juntos em uma única operação, pode dar resultados inesperados em alguns casos, eu recomendo sempre usar &&, mas essa é a sua escolha.
Por outro lado, "&" é uma operação AND bit a bit . É usado para a avaliação e manipulação de bits específicos dentro do valor inteiro.
Exemplo: se você fizer (14 e 7), o resultado será 6.
fonte
Se os padrões de codificação para a base de código específica para a qual estou escrevendo o código especificar qual operador deve ser usado, eu definitivamente o utilizarei. Caso contrário, e o código determina qual deve ser usado (não frequentemente, pode ser facilmente contornado), então usarei isso. Caso contrário, provavelmente
&&
.É mais legível para você . A resposta é sim e não, dependendo de muitos fatores, incluindo o código em torno do operador e, de fato, a pessoa que o lê!
Sim. Consulte operadores lógicos para
||
e operadores bit a bit para~
.fonte
Eu acho que é uma questão de gosto, embora (erroneamente) misturá-las possa causar alguns comportamentos indesejados:
Portanto, usando && e || é mais seguro, pois eles têm a maior precedência. No que diz respeito à legibilidade, eu diria que esses operadores são universais o suficiente.
ATUALIZAÇÃO : Sobre os comentários dizendo que ambas as operações retornam falsas ... bem, na verdade o código acima não retorna nada, desculpe-me pela ambiguidade. Para esclarecer: o comportamento no segundo caso depende de como o resultado da operação é usado. Observe como a precedência dos operadores entra em jogo aqui:
O motivo
$a === true
é que o operador de atribuição tem precedência sobre qualquer operador lógico, como já foi muito bem explicado em outras respostas.fonte
Aqui está um pequeno exemplo de contador:
resultado:
Eu diria que esse tipo de erro de digitação tem muito mais probabilidade de causar problemas insidiosos (da mesma maneira que
=
vs==
) e tem muito menos probabilidade de ser notado do queadn
/ro
typo, que sinalizará como erros de sintaxe. Também acho e / ou é muito mais fácil de ler. FWIW, a maioria das estruturas PHP que expressam uma preferência (a maioria não) especifica e / ou. Eu também nunca me deparei com um caso real, não artificial, em que isso teria importância.fonte
Outro bom exemplo usando
if
instruções sem=
operações de atribuição.e
porque
AND
tem uma precedência mais baixa e, portanto,||
uma precedência mais alta.Estes são diferentes nos casos de
true, false, false
etrue, true, false
. Veja https://ideone.com/lsqovs para um exemplo elaborado.fonte