¿Cómo funciona una instrucción if de Java cuando tiene una asignación y una verificación de igualdad 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 qué esta impresión es FALSA?
java
if-statement
logic
RoHaN
fuente
fuente
test1=false
,test1==false
esfalse
,false || false
esfalse or false
cuál esfalse
.test1 = true
Respuestas:
La expresión no se analiza de la forma en que piensa. No es
en cuyo caso el resultado habría sido
true
, peroEl valor de la
false || test1 == false
expresión se calcula primero, y lo esfalse
, porquetest1
está configurado paratrue
entrar en el cálculo.La razón por la que se analiza de esta manera es que la precedencia de
||
es menor que la del==
operador, pero mayor que la precedencia del operador de asignación=
.fuente
((test1 = false) || test1 == false)
el valor general seríatrue
.==
está arriba||
, pero=
está abajo||
.||
). La precedencia relativa de||
y==
solo es relevante para mostrar que el análisis sintáctico no es como entest1 = ((false || test1) == false)
, lo que no creo que nadie esperaría razonablemente (por cierto, la precedencia relativa, o más en general||
,&&
tiene una precedencia menor que las relaciones, también es fácil de recuerde, ya que se usa todo el tiempo).||
y==
vs||
y=
explica por qué esto se comporta de manera diferente al caso (común) dea == b || c == d
.Este es un problema de precedencia, básicamente. Está asumiendo que su código es equivalente a:
... pero no lo es. En realidad, es equivalente a:
... que es equivalente a:
(porque
test1
estrue
para empezar)... que es equivalente a:
que asigna el valor
false
atest1
, siendo el resultado de la expresiónfalse
.Consulte el tutorial de Java sobre operadores para obtener una tabla útil de precedencia de operadores.
fuente
La expresión
test1 = false || test1 == false
se evaluará en el siguiente paso.PASO: 1-
test1 = false || test1 == false
// la precedencia de==
es la más altaPASO: 2-
test1 = false || false
// El operador||
tiene mayor prioridadPASO 3-
test1 = false
PASO 4-
false
Dado que el valor booleano de la expresión se vuelve falso, se está ejecutando la instrucción else.
fuente
(test1 = false || test1 == false)
devuelve falso, porque ambos son falsos.(test1 = false || test1 == true)
esto es cierto porque uno de ellos es ciertofuente