Me expliquem algumas coisas sobre operadores lógicos

Olá, faz pouco que eu estudei os operadores lógicos, mas não entendi muito bem, onde eu li não estava muito bem explicado. Poderiam me explicar o que cada um faz e explicar as diferenças entre eles? Obrigado.

Se você quiser conferir uma aula no youtube que eu mesmo fiz eu explico como funciona, se caso não entender pelo vídeo eu tento te explicar melhor aqui.

Você usa operadores lógicos no próprio português. Por exemplo:

Hipótese: Naquela cesta tem uma maça E uma laranja.
Você abre a cesta e encontra lá apenas uma maçã.

A hipótese era verdadeira ou falsa?
Quando seria verdadeira?

E se eu tivesse dito:
Hipótese: Naquela cesta tem uma maça OU uma laranja.
Seria verdadeira? E que situações isso seria verdadeiro.

Operadores lógicos permitem que você faça o mesmo tipo de comparação no Java. No caso, o operador && é usado para representar o E, enquanto o operador || para representar o OU.
Por exemplo, você quer imprimir o nome de alguém que tenha mais de 20 anos e seja homem:

if (sexo.equals("homem") && idade > 20) //&& corresponde ao "e". System.out.println(nome);

Existe também o operador ! que representa o não. No caso, você gostaria de dizer:
Hipótese: No cesto não há uma maçã
Se abrir o cesto e houver, a hipótese é falsa.

Por exemplo, imprimir o nome de todos que não são Brasileiros:

if (!nacionalidade.equals("Brasileiro")) { System.out.println(nome);

A bagunça acontece quando você combina vários operadores desses. Nesse caso, só estudando lógica mais a fundo para entender a loucura. :wink:

Operadores Lógicos e relacionais… mais explicado que no link abaixo impossível!

http://webdrops.wordpress.com/2007/10/25/java-operadores-relacionais-e-logicos/

Sucesso!

ViniGodoy, sua explicação ficou bastante clara parabéns!

Só tomar o seguinte cuidado.

Em português, vamos fazer os equivalentes precisos dos operadores lógicos:

&& == e (só que, se o primeiro operando for false, nem calcula o segundo. Em inglês: “and then”).
& == e (sempre calcula os dois operandos)
|| == e/ou (só que, se o primeiro operando for true, nem calcula o segundo. Em inglês: “or else”)
| == e/ou (sempre calcula os dois operandos)
^ == ou … ou … (por exemplo, “Ou isto ou aquilo” seria “isto ^ aquilo”)
! == não

[quote=entanglement]Só tomar o seguinte cuidado.

Em português, vamos fazer os equivalentes precisos dos operadores lógicos:

&& == e (só que, se o primeiro operando for false, nem calcula o segundo. Em inglês: “and then”).
& == e (sempre calcula os dois operandos)
|| == e/ou (só que, se o primeiro operando for true, nem calcula o segundo. Em inglês: “or else”)
| == e/ou (sempre calcula os dois operandos)
^ == ou … ou … (por exemplo, “Ou isto ou aquilo” seria “isto ^ aquilo”)
! == não[/quote]

Estava lendo o topico e me surgiu uma dúvida.

Não conhecia os operadores | e & “sozinhos”. MAs como foi dito, ele calcula os dois operandos, mas minha dúvida é. Em que casos isso é necessário?

Obrigado.

Eu costumo usar | e & , na verdade, apenas quando vou usar com operandos inteiros (ou seja, bit a bit).
Mas pode ocorrer alguma situação em que é necessário realmente calcular os dois operandos para ter resultados consistentes. Não estou conseguindo imaginar ainda uma situação.

Cuidado no caso do OU, ao se transcrever para o português.

Na fala, usamos muito o OU no sentido do ou exclusivo. Por exemplo:
“No cesto tem uma maça ou uma laranja”. Se tiver os dois, a resposta no caso dos operadores lógicos é verdadeira.

O OU exclusivo, a rigor, é transformado para o português assim:
“No cesto, ou tem uma maçã, ou tem uma laranja.”

[quote=entanglement]Eu costumo usar | e & , na verdade, apenas quando vou usar com operandos inteiros (ou seja, bit a bit).
Mas pode ocorrer alguma situação em que é necessário realmente calcular os dois operandos para ter resultados consistentes. Não estou conseguindo imaginar ainda uma situação. [/quote]

Eu só imagino que seja necessário se você realiza alguma operação nos operandos, tendo assim que executar os posteriores, mas não me parece um código muito limpo.

[quote=ViniGodoy]Cuidado no caso do OU, ao se transcrever para o português.

Na fala, usamos muito o OU no sentido do ou exclusivo. Por exemplo:
“No cesto tem uma maça ou uma laranja”. Se tiver os dois, a resposta no caso dos operadores lógicos é verdadeira.

O OU exclusivo, a rigor, é transformado para o português assim:
“No cesto, ou tem uma maçã, ou tem uma laranja.”[/quote]

E é por isso que eu usei o “e/ou” - por exemplo, em uma folha de cheque você pode exigir a assinatura dos dois correntistas (é uma conta “E”) ou então aceitar que um deles, ou os dois, assinem a folha (é uma conta “E/OU”). O “||” é o “E/OU” e o “&&” é o “E”.

Por exemplo, uma conta conjunta poderia ser de “Aristodemo de Oliveira E Claudionora de Oliveira” (ou seja, Aristodemo && Claudionora)
ou então “Aristodemo de Oliveira E/OU Josefa Maria Junqueira” (ou seja, Aristodemo || Josefa).

Desculpem dar um exemplo bancário, mas é vício da profissão.

[quote=ViniGodoy]Na fala, usamos muito o OU no sentido do ou exclusivo. Por exemplo:
“No cesto tem uma maça ou uma laranja”. Se tiver os dois, a resposta no caso dos operadores lógicos é verdadeira.

O OU exclusivo, a rigor, é transformado para o português assim:
“No cesto, ou tem uma maçã, ou tem uma laranja.” [/quote]

Uia, legal isso, nunca tinha parado pra pensar dessa forma, qdo nos explicamos aos outros, por saber do contexto, nem pensamos que o aprendiz possa pensar que necessariamente haverá uma das opções…
Devem ter vários tutoriais que não deixa isso claro por ai…

Vamos aprender um pouco de inglês :slight_smile:

NEITHER x NOR y (nem X nem Y) --> em Java, !x && !y ou ! (x || y)
EITHER x OR y (ou X ou Y) --> x ^ y
BOTH x AND y (X e Y) --> x && y

[quote=jks1903][quote=entanglement]Só tomar o seguinte cuidado.

Em português, vamos fazer os equivalentes precisos dos operadores lógicos:

&& == e (só que, se o primeiro operando for false, nem calcula o segundo. Em inglês: “and then”).
& == e (sempre calcula os dois operandos)
|| == e/ou (só que, se o primeiro operando for true, nem calcula o segundo. Em inglês: “or else”)
| == e/ou (sempre calcula os dois operandos)
^ == ou … ou … (por exemplo, “Ou isto ou aquilo” seria “isto ^ aquilo”)
! == não[/quote]

Estava lendo o topico e me surgiu uma dúvida.

Não conhecia os operadores | e & “sozinhos”. MAs como foi dito, ele calcula os dois operandos, mas minha dúvida é. Em que casos isso é necessário?

Obrigado.[/quote]

Os operadores && e || são operadores lógicos.
O & , | e ^ não são operadores lógicos, são operadores binários.

A diferença é que operadores lógicos só funcionam com boolean, enquanto operadores binários funcionam com qualquer sequencia de bits (inclusive double e float , mas ai fica complexo saber o resutado).

Os operadores binários comparam bit a bit, os lógicos compara o valor diretamente na tabela de verdade. É por isso que eles são curto-circuito porque se a tabela de verdade já dá um resultado final no primeiro operando nenhum outro é lido

Se usar & e | com boolean também funciona e dá o mesmo resultado que com os operadores lógicos porque o booleean tb é binário e a lógica binária comanda que o resultado seja o mesmo, contudo, como são operadores bit a bit, eles têm que olhar todos os bits e por isso não ha curto-cricuito. Na prática usar & e | com boolean é um erro.

Taborda-sensei, pelo menos nas linguagens derivadas da C (como Java, C++, C# etc) os operadores bit-a-bit (^, | e &) não trabalham sobre doubles ou floats.

No caso do Java, você pode fazer uma pequena mágica, que é o de converter um double para sua representação de 64 bits (usando http://docs.oracle.com/javase/6/docs/api/java/lang/Double.html#doubleToRawLongBits(double) para double -> long, e http://docs.oracle.com/javase/6/docs/api/java/lang/Double.html#longBitsToDouble(long) para long -> double), mas isso é relativamente pouco usado (é necessário, por exemplo, quando queremos converter um double para sua notação hexadecimal. )

[quote=entanglement]Taborda-sensei, pelo menos nas linguagens derivadas da C (como Java, C++, C# etc) os operadores bit-a-bit (^, | e &) não trabalham sobre doubles ou floats.

No caso do Java, você pode fazer uma pequena mágica, que é o de converter um double para sua representação de 64 bits (usando http://docs.oracle.com/javase/6/docs/api/java/lang/Double.html#doubleToRawLongBits(double) para double -> long, e http://docs.oracle.com/javase/6/docs/api/java/lang/Double.html#longBitsToDouble(long) para long -> double), mas isso é relativamente pouco usado (é necessário, por exemplo, quando queremos converter um double para sua notação hexadecimal. )
[/quote]

É. Eu me confundi. O operador que operar sobre inteiros e doubles é o modulo ((d % 1) == 0)
Mas tem isso ai que vc falou que é converter para long e depois usar os operadores. E a conversão só é possivel porque é tudo sequencias de bits.
Realmente é muito raro vc precisar disso.

Certo pessoal, esclarecido.

Obrigado.