¿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==falseesfalse,false || falseesfalse or falsecuál esfalse.test1 = trueRespuestas:
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 == falseexpresión se calcula primero, y lo esfalse, porquetest1está configurado paratrueentrar 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
test1estruepara empezar)... que es equivalente a:
que asigna el valor
falseatest1, 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 == falsese 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 = falsePASO 4-
falseDado 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