Eu só estou me perguntando por que geralmente usamos OR lógico ||
entre dois booleanos não bit a bit OU |
, embora ambos estejam funcionando bem.
Quero dizer, veja o seguinte:
if(true | true) // pass
if(true | false) // pass
if(false | true) // pass
if(false | false) // no pass
if(true || true) // pass
if(true || false) // pass
if(false || true) // pass
if(false || false) // no pass
Podemos usar em |
vez de ||
? A mesma coisa com &
e &&
.
java
bitwise-operators
Eng.Fouad
fonte
fonte
||
e&&
curto-circuito enquanto|
e&
estão ansiosos.&&
e||
, mas nunca&
|
. Se você está fazendo algo que depende de efeitos colaterais, não vejo por que você usaria algo assim,(a & b | c)
já que alguém poderia pensar facilmente: "Eu posso otimizar isso usando as versões em curto-circuito".Respostas:
Se você usar os
||
e&&
formas, ao invés do|
e&
formas de estes operadores, Java não vai se preocupar em avaliar a direita operando sozinho.É uma questão de se você deseja dar um curto-circuito na avaliação ou não - na maioria das vezes você deseja.
Uma boa maneira de ilustrar os benefícios do curto-circuito seria considerar o exemplo a seguir.
Outro benefício, como Jeremy e Peter mencionaram, para um curto-circuito é a verificação de referência nula:
mais informações
fonte
foo != null && foo.hasBar()
foo != null && foo.hasBar()
) ou mais rápidas (b || foo.timeConsumingCall()
). 99% dos desenvolvedores não precisam se preocupar com esse nível de micro-otimização.string == null || string.isEmpty()
;)|
não faz avaliação de curto-circuito em expressões booleanas.||
parará de avaliar se o primeiro operando é verdadeiro, mas|
não será.Além disso,
|
pode ser usado para executar a operação OR bit a bit em valores de byte / short / int / long.||
não podes.fonte
Portanto, para aproveitar as outras respostas com um exemplo, o curto-circuito é crucial nas seguintes verificações defensivas:
Usar
|
e, em&
vez disso, pode resultar emNullPointerException
ser jogado aqui.fonte
foo
. O "exemplo canônico" de Peter Lawrey é o melhor.Lógico
||
e&&
verifique o lado direito somente se necessário. O|
e&
verifique os dois lados toda vez.Por exemplo:
Reescreva-o:
Outro exemplo:
Reescreva-o:
fonte
Observe também uma armadilha comum: os operadores não preguiçosos têm precedência sobre os preguiçosos, portanto:
Tenha cuidado ao misturá-los.
fonte
Além do curto-circuito, outra coisa a ter em mente é que fazer uma operação lógica bit a bit em valores que podem ser diferentes de 0 ou 1 tem um significado muito diferente da lógica condicional. Embora geralmente seja o mesmo para
|
e||
, com&
e&&
você obtém resultados muito diferentes (por exemplo,2 & 4
é 0 / falso, enquanto2 && 4
é 1 / verdadeiro).Se o que você obtém de uma função é realmente um código de erro e está testando não-0-ness, isso pode importar bastante.
Isso não é um problema tão grande em Java, no qual você precisa tipicamente explicitar para booleano ou comparar com 0 ou algo semelhante, mas em outros idiomas com sintaxe semelhante (C / C ++ et al), pode ser bastante confuso.
Além disso, observe que & e | só pode ser aplicado a valores do tipo inteiro e nem tudo o que pode ser equivalente a um teste booleano. Novamente, em linguagens não Java, existem algumas coisas que podem ser usadas como booleanas com uma
!= 0
comparação implícita (ponteiros, flutuadores, objetos com umoperator bool()
etc.) e os operadores bit a bit são quase sempre sem sentido nesses contextos.fonte
O único momento em que você usaria
|
ou em&
vez de||
ou&&
é quando você tem expressões booleanas muito simples e o custo de atalho (ou seja, uma ramificação) é maior que o tempo que você economiza ao não avaliar as expressões posteriores.No entanto, essa é uma micro-otimização que raramente importa, exceto no código de nível mais baixo.
fonte
|| é o lógico ou operador enquanto | é o operador bit a bit ou
fonte
a | b: avalie b em qualquer caso
a || b: avalie b apenas se a for avaliado como falso
fonte
Além do fato de que | é um operador bit a bit: || é um operador de curto-circuito - quando um elemento é falso, ele não verifica os outros.
se algo é VERDADEIRO, || não avaliará algo, enquanto | vai fazer. Se as variáveis em suas instruções if forem realmente chamadas de função, use || possivelmente está economizando muito desempenho.
fonte
fonte
Os operadores
||
e&&
são chamados operadores condicionais , enquanto|
e&
são chamados operadores bit a bit . Eles servem a propósitos diferentes.Operadores condicionais funcionam apenas com expressões que são avaliadas estaticamente
boolean
nos lados esquerdo e direito.Operadores bit a bit funcionam com qualquer operando numérico.
Se você deseja realizar uma comparação lógica, use operadores condicionais , pois adicionará algum tipo de segurança de tipo ao seu código.
fonte
|
e&
também são operadores condicionais. Por favor, veja o link no meu comentário para a postagem original.|
e&
poder ser usado como operadores bit a bit é uma questão completamente separada.Uma observação: Java possui | =, mas não um || =
Um exemplo de quando você deve usar || é quando a primeira expressão é um teste para ver se a segunda expressão explodiria. por exemplo, usando um único | no seguinte caso pode resultar em um NPE.
fonte
As outras respostas fizeram um bom trabalho ao cobrir a diferença funcional entre os operadores, mas as respostas podem se aplicar a praticamente todas as linguagens derivadas de C existentes hoje. A pergunta está marcada comJavae, por isso, tentarei responder específica e tecnicamente à linguagem Java.
&
e|
podem ser operadores inteiros bit a bit ou operadores lógicos booleanos. A sintaxe para os operadores bit a bit e lógicos ( §15.22 ) é:A sintaxe para
EqualityExpression
é definida no §15.21 , que requerRelationalExpression
definido no §15.20 , que por sua vez requerShiftExpression
eReferenceType
definido nos §15.19 e §4.3 , respectivamente.ShiftExpression
Os requisitosAdditiveExpression
definidos no §15.18 , que continuam a detalhar, definindo a aritmética básica, os operadores unários, etc. detalhamReferenceType
todas as várias maneiras de representar um tipo. (EmboraReferenceType
não inclua os tipos primitivos, a definição de tipos primitivos é finalmente necessária, pois eles podem ser o tipo de dimensão para uma matriz, que é aReferenceType
.)Os operadores bit a bit e lógicos têm as seguintes propriedades:
A distinção entre se o operador serve como operador bit a bit ou operador lógico depende se os operandos são "conversíveis em um tipo integral primitivo" ( §4.2 ) ou se são do tipo
boolean
ouBoolean
( §5.1.8 ).Se os operandos são do tipo integral, a promoção numérica binária ( §5.6.2 ) é realizada nos dois operandos, deixando-os como
long
s ouint
s para a operação. O tipo da operação será o tipo dos operandos (promovidos). Nesse ponto,&
será AND bit a bit,^
será OR bit a bit exclusivo e|
será OR bit a bit, inclusive. ( §15.22.1 )Se os operandos forem
boolean
ouBoolean
, os operandos estarão sujeitos à conversão de unboxing, se necessário ( §5.1.8 ), e o tipo da operação seráboolean
.&
resultará emtrue
se ambos os operandos foremtrue
,^
resultará emtrue
se ambos operandos forem diferentes e|
resultará emtrue
se qualquer operando fortrue
. ( §15.22.2 )Por outro lado,
&&
é o "Operador condicional-E" ( §15.23 ) e||
é o " Operador condicional-E " ( §15.24 ). Sua sintaxe é definida como:&&
é como&
, exceto que ele avalia apenas o operando direito se o operando esquerdo estivertrue
.||
é como|
, exceto que ele avalia apenas o operando direito se o operando esquerdo estiverfalse
.Condicional-E tem as seguintes propriedades:
Condicional-Or tem as seguintes propriedades:
Resumindo, como @JohnMeagher apontou repetidamente nos comentários,
&
e|
são, de fato, operadores booleanos sem curto-circuito no caso específico dos operandos serem umboolean
ou outroBoolean
. Com boas práticas (ou seja, sem efeitos secundários), essa é uma pequena diferença. Quando os operandos não sãoboolean
s ouBoolean
s, no entanto, os operadores se comportam de maneira muito diferente: as operações bit a bit e lógicas simplesmente não se comparam bem no alto nível da programação Java.fonte
1). (Expressão1 | expressão2), | O operador avaliará a expressão2, independentemente de o resultado da expressão1 ser verdadeiro ou falso.
Exemplo:
2). (Expressão1 || expressão2), || O operador não avaliará a expressão2 se a expressão1 for verdadeira.
Exemplo:
fonte
|| retorna um valor booleano OR'ing dois valores (é por isso que é conhecido como LOGICAL or)
IE:
Retornaria true se A ou B for true ou false se ambos forem falsos.
| é um operador que executa uma operação bit a bit em dois valores. Para entender melhor as operações bit a bit, você pode ler aqui:
http://en.wikipedia.org/wiki/Bitwise_operation
fonte
Uma diferença principal é que || e && exibem "curto-circuito"; portanto, o RHS será avaliado apenas se necessário.
Por exemplo
Acima, se a for verdadeiro, b não será testado e o caminho1 será executado. Se | foi usado, os dois lados serão avaliados mesmo se 'a' for verdadeiro.
Veja aqui e aqui , para um pouco mais de informação.
Espero que isto ajude.
fonte
Um curto-circuito não pode ser útil. Às vezes, você deseja garantir que duas expressões sejam avaliadas. Por exemplo, digamos que você tenha um método que remova um objeto de duas listas separadas. Você pode fazer algo assim:
Se, em vez disso, seu método usasse o operando condicional, ele falharia em remover o objeto da segunda lista se a primeira lista retornasse false.
Não é incrivelmente útil e (como na maioria das tarefas de programação), você pode consegui-lo com outros meios. Mas é um caso de uso para operandos bit a bit.
fonte
A diferença básica entre eles é que | primeiro converte os valores em binário e depois executa o bit ou operação. Enquanto isso, || não converte os dados em binários e apenas executa a expressão ou em seu estado original.
Leia mais: http://javarevisited.blogspot.com/2015/01/difference-between-bitwsie-and-logical.html#ixzz45PCxdQhk
fonte
Quando tive essa pergunta, criei o código de teste para ter uma idéia sobre isso.
Nesse caso, apenas alteramos o valor do lado esquerdo de se a condição adicionar a ou b.
resultado
"If condition executed"
Resultado-
Conclusion of ||
Quando usado||
, o lado direito verifica apenas quando o lado esquerdo é falso.Resultado-
Resultado-
Conclusion of |
Quando usar|
, verifique os lados esquerdo e direito.fonte
| = bit a bit ou, || = lógica ou
fonte
normalmente eu uso quando há pré-incremento e pós-incremento. Veja o seguinte código:
resultado:
os dois
if
blocos são iguais, mas o resultado é diferente. quando houver|
, ambas as condições serão avaliadas. Mas, se for||
, não avaliará a segunda condição, pois a primeira condição já é verdadeira.fonte
Existem muitos casos de uso que sugerem por que você deveria procurar
||
e não|
. Alguns casos de uso precisam usar o|
operador para verificar todas as condições.Por exemplo, se você deseja verificar a validação do formulário e deseja mostrar ao usuário todos os campos inválidos com textos de erro, em vez de apenas um primeiro campo inválido.
||
operador seria,Portanto, com o snippet acima, se o usuário enviar o formulário com TODOS os campos vazios, APENAS
nameField
será mostrado com mensagem de erro. Mas, se você mudar para,Ele mostrará uma mensagem de erro adequada em cada campo, independentemente das
true
condições.fonte
Depois de ler atentamente, este tópico ainda não está claro para mim, se o uso
|
como operador lógico estiver em conformidade com as práticas padrão do Java.Modifiquei recentemente o código em uma solicitação pull que aborda um comentário em que
teve que ser alterado para
Qual é a versão realmente aceita?
Não estou interessado em votar, mas mais em descobrir o padrão ?! Ambas as versões de código estão compilando e funcionando conforme o esperado.
fonte
|| é um lógico ou e | é um pouco sábio ou.
fonte
Operadores Java
| é bit a bit ou, || é lógico ou.
fonte
Dê uma olhada em:
http://java.sun.com/docs/books/tutorial/java/nutsandbolts/operators.html
| é OR bit a bit, inclusive
|| é lógico OU
fonte
| é um operador bit a bit. || é um operador lógico.
Um vai levar dois bits e ou eles.
Determinaremos a verdade (isto ou aquilo) Se isso é verdade ou aquilo é verdade, então a resposta é verdadeira.
Ah, e as pessoas respondem a essas perguntas rapidamente.
fonte