Operadores Logicos

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() &gt 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() &gt 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 ==&gt 10 em binário
00000101 ==&gt 5 em binário
---------------
00001111 ==&gt 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 ==&gt 10 em binário
00000101 ==&gt 5 em binário
---------------
00001111 ==&gt 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, :smiley:

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.