Vi essa questao e nao conseguir entender por que não é analisado o “ou” “l”, alguem me ajuda a entender?
if((2>3)&&(3>1) | true)
System.out.println("trueee");
Vi essa questao e nao conseguir entender por que não é analisado o “ou” “l”, alguem me ajuda a entender?
if((2>3)&&(3>1) | true)
System.out.println("trueee");
O operador &&, além de tentar simplificar fórmulas, tem menos precedência que o operador |
Ou seja, ele começa avaliando o final, para só então fazer o &&.
Se você for usar operadores com um único símbolo (& e |) para avaliar expressões lógicas, não os misture com os de dois símbolos && e ||, justamente para não criar fórmulas confusas, devido à precedência.
O operador &&, além de tentar simplificar fórmulas, tem precedência sobre o operador |Como 2>3 já é false, todo o resto nem sequer é avaliado.
Se você for usar operadores com um único símbolo (& e |) para avaliar expressões lógicas, não os misture com os de dois símbolos && e ||, justamente para não criar fórmulas confusas, devido à precedência.
Entendi, mas pq assim funciona:
if(((2>3)&&(3>1)) | true)
System.out.println("trueee");
2>3 retorna false
entao ele pula para o "ou" e retorna true.
Por que os parênteses alteram a precedência, oras.
Agora a primeira expressão avaliada é:
(XXX) | true
Na hora de avaliar os parênteses, é que há o curto circuito, mas ele não elimina e expressão de fora:
Parênteses -> (2>3)&&(3>1)
Avalia: 2 > 3
Retorna: False
Expressão de fora:
false | true
Resultado: True
No outro caso. A primeira expressão avaliada é:
(3>1) | true
Retorna true.
Em seguida, compara-se com:
2 > 3 && true
Resultado false.
Por que os parênteses alteram a precedência, oras.Agora a primeira expressão avaliada é:
(XXX) | trueNa hora de avaliar os parênteses, é que há o curto circuito, mas ele não elimina e expressão de fora:
Parênteses -> (2>3)&&(3>1)
Avalia: 2 > 3
Retorna: FalseExpressão de fora:
false | trueResultado: True
No outro caso. A primeira expressão avaliada é:
(3>1) | trueRetorna true.
Em seguida, compara-se com:
2 > 3 && trueResultado false.
Obrigado.
Se esse tipo de coisa cai na certificação, é um bom tema para o tópico de pegadinhas que o FullBend criou.
Não sei se cai, estou estudando pra tentar tirar a certificação.
não é fácil pra entender…
É precedência.
Se quiser entender, imagine que o && é um sinal de +, || um sinal de -. O | é um sinal de * e o & um sinal de /.
(2>3) + (3>1) * true
Considerando que fosse possível fazer as multiplicações e as somas, em que ordem ocorreriam? E veja ainda na segunda formula:
((2>3) + (3>1)) * true
Entendeu pq a inclusão dos parênteses altera a precedência?
que didática! brigaduuu… 
Pô Vini parabéns mais uma vez, otima sua explicação.