Como uma instrução Java if funciona quando tem uma atribuição e uma verificação de igualdade OR
-d juntas ??
public static void test() {
boolean test1 = true;
if (test1 = false || test1 == false) {
System.out.println("TRUE");
} else {
System.out.println("FALSE");
}
}
Por que esta impressão é FALSA?
java
if-statement
logic
RoHaN
fonte
fonte
test1=false
,test1==false
éfalse
,false || false
é ofalse or false
que éfalse
.test1 = true
Respostas:
A expressão não é analisada da maneira que você pensa. Não é
nesse caso, o resultado teria sido
true
, masO valor da
false || test1 == false
expressão é calculado primeiro, e éfalse
, porquetest1
está definido paratrue
entrar no cálculo.O motivo pelo qual ele é analisado dessa maneira é que a precedência do
||
é menor do que a do==
operador, mas maior do que a precedência do operador de atribuição=
.fonte
((test1 = false) || test1 == false)
o valor geral seriatrue
.==
está acima||
, mas=
está abaixo||
.||
). A precedência relativa de||
e==
só é relevante para mostrar que a análise não é como emtest1 = ((false || test1) == false)
, o que eu não acho que alguém esperaria razoavelmente (a propósito que a precedência relativa, ou mais geralmente isso||
,&&
tem precedência inferior às relações, também é fácil de lembre-se, uma vez que usado o tempo todo).||
e==
vs||
e=
explica por que isso se comporta de maneira diferente do caso (comum) dea == b || c == d
.Esta é uma questão de precedência, basicamente. Você está assumindo que seu código é equivalente a:
... Mas isso não. Na verdade, é equivalente a:
... que é equivalente a:
(porque
test1
étrue
para começar)... que é equivalente a:
que atribui o valor
false
atest1
, com o resultado da expressão sendofalse
.Consulte o tutorial Java sobre operadores para obter uma tabela útil de precedência de operadores.
fonte
A expressão
test1 = false || test1 == false
será avaliada na etapa seguinte.ETAPA: 1-
test1 = false || test1 == false
// a precedência de==
é mais altaETAPA: 2-
test1 = false || false
// Operador||
tem maior precedênciaETAPA 3-
test1 = false
PASSO 4-
false
Já que o valor booleano da expressão torna-se falso. Então, a instrução está sendo executada.
fonte
(test1 = false || test1 == false)
retorna falso, porque ambos são falsos.(test1 = false || test1 == true)
isso é verdade porque um deles é verdadeirofonte