Duvida básica. Qual a diferença entre usar:
| ou ||
e ente & ou &&
Venom
Duvida básica. Qual a diferença entre usar:
| ou ||
e ente & ou &&
Venom
Os operadores || e && são chamados de ‘short circuit operators’, isso pq param de analisar a expressão assim que percebem que não ocorrerá mudança no resultado.
Por exemplo:
if( (1==1) || (x==33) ){
note que não ocorrerá mudança já que após a análise do primeiro termo não ocorrerá mais modificação do resultado (sempre será verdadeiro).
Já para os operadores | e &, a análise é realizada em toda a expressão.
Isto pode ser útil se vc tem algo do tipo:
if( (1==1) | (x++==33) ){
neste caso a variável x será incrementada, caso utilize o operador ‘||’ esta não seria incrementada.
Não sei dizer qual a ordem de análise da expressão (se da direita para a esquerda ou ao contrário), alguém sabe?
[ ]s
jef
Quando você use esses operadores com boolean, a diferença é que com o && e o || o java fará um "curto circuito" na expressão.
Isso significa que nas expressões:
x == false && y != false
x == true || x != false
O valor de y nem sequer será availado se x for true. Isso permite que você faça coisas como:
if (lista != null && lista.size() > 0) {
// Do something
}
Pois, se lista for nula, lista.size() não será testado, não gerando assim uma NullPointerException.
Agora, quando você usa & e |, esse curto circuito não acontece. Se aquele for ali em cima fosse:
if (lista != null & lista.size() > 0) {
// Do something
}
E o valor da lista fosse nulo, o java geraria uma NullPointerException.
Diferente desse caso, quando o curto circuito é insignificante para a avaliação, não há diferença no resultado final dos operadores & e &&; e | e ||. A única diferença mesmo é na forma como elas são avaliadas.
Fora os exemplos citados, os operadores & e | são úteis em operações numéricas, como por exemplo:
x = y | 5
Istó fara com com que os bits que representam o valor numérico de y sejam confrontados contra os bits que representam 5 e feito um "ou" entre eles. Suponhamos y = 10. Assim:
00001010 ==> 10 em binário
00000101 ==> 5 em binário
---------------
00001111 ==> 15 em binário como resultado do "ou" entre os bits
Uso é bem usado em algoritimos de criptografia, compactação…
[]'s
Outra forma de entender também como tudo funciona é o seguinte.
a && b
Retorna true se a e b forem ambos true. Senão retorna false. Se a for false, b não é avaliada
a & b
Retorna true se a e b forem ambos true. Senão retorna false. Ambas expressões a e b são sempre avaliadas.
a || b
Retorna true se a ou b for true. Senão retorna false. Se a for true, b não é avaliada.
a | b
Retorna true se a ou b for true. Senão retorna false. Ambas expressões a e b são sempre avaliadas.
Repare quando é usada o operador &&, se a primeira expressão não for true a segunda nunca será avaliada. E o operador ||, se a primeira expressão for true a segunda nunca será avaliada.
No caso dos operadores & e | ambas expressões sempre será avaliada.
Ok
Abraços
T+
:thumbup:
[quote=Bjornn Borg]Fora os exemplos citados, os operadores & e | são úteis em operações numéricas, como por exemplo:
x = y | 5
Istó fara com com que os bits que representam o valor numérico de y sejam confrontados contra os bits que representam 5 e feito um "ou" entre eles. Suponhamos y = 10. Assim:
00001010 ==> 10 em binário
00000101 ==> 5 em binário
---------------
00001111 ==> 15 em binário como resultado do "ou" entre os bits
Uso é bem usado em algoritimos de criptografia, compactação…
[]'s[/quote]
Muito legal isso aqui, eu tinha esquecido que existia,
Agardeço a explicação e especialmente os exemplos que ajudaram a finalmente entender a diferenca entre os operadores.
Venomtotal
A única diferença entre as versões comum e de curto-circuito é que a versão comum sempre avalia cada operando e a versão de curto-circuito só avalia o segundo operando quando necessário.