¿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?

Author: James Webster, 2015-04-16

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 =.

 186
Author: dasblinkenlight,
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.

 82
Author: Jon Skeet,
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

por favor, eche un vistazo a la precedencia de los operadores

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.

 2
Author: ,
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-05-06 07:14:29

(test1 = false || test1 == false) devuelve false, porque ambos son falsos.(test1 = false || test1 == true) esto es cierto porque uno de ellos es cierto

 -10
Author: Den,
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