¿Por qué esta declaración if, con un control de asignación e igualdad, se evalúa como falsa?
¿Cómo funciona una instrucción Java if cuando tiene una asignación y un control de igualdad OR
-d juntos??
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?
4 answers
La expresión no se analiza como usted piensa. No es
(test1=false) || (test1 == false)
, En cuyo caso el resultado habría sido true
pero
test1 = (false || test1 == false)
El valor de la expresión false || test1 == false
se calcula primero, y es false
, porque test1
se establece en true
al entrar en el cálculo.
La razón por la que se analiza de esta manera es que la precedencia del ||
es menor que la del operador ==
, pero mayor que la precedencia del operador de asignación =
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-04-16 09:43:19
Este es un problema de precedencia, básicamente. Estás asumiendo que tu código es equivalente a:
if ((test1 = false) || (test1 == false))
... pero no lo es. En realidad es equivalente a:
if (test1 = (false || test1 == false))
... que es equivalente a:
if (test1 = (false || false))
(porque test1
es true
para empezar)
... que es equivalente a:
if (test1 = false)
Que asigna el valor false
a test1
, siendo el resultado de la expresión false
.
Vea el tutorial de Java sobre operadores para una tabla útil de precedencia del operador.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-04-16 10:00:52
La expresión test1 = false || test1 == false
se evaluará en el siguiente paso.
PASO:1- test1 = false || test1 == false
//la precedencia de ==
es mayor
PASO:2- test1 = false || false
// Operador ||
tienen mayor prioridad
PASO:3- test1 = false
PASO:4- false
Dado que el valor booleano de la expresión se convierte en false.So la declaración else está siendo ejecutada.
(test1 = false || test1 == false)
devuelve false, porque ambos son falsos.(test1 = false || test1 == true)
esto es cierto porque uno de ellos es cierto
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-04-18 08:41:30