En Java, ¿cuál es el "orden de operaciones" booleano?


Tomemos un ejemplo simple de un objeto Cat. Quiero estar seguro de que" not null " cat es naranja o gris.

if(cat != null && cat.getColor() == "orange" || cat.getColor() == "grey") {
//do stuff
}

Creo Y viene primero, luego el quirófano. Sin embargo, estoy un poco borroso, así que aquí están mis preguntas:

  1. ¿Puede alguien guiarme a través de esta declaración para que esté seguro de que entiendo lo que sucede?

  2. Además, ¿qué sucede si agrego paréntesis; eso cambia el orden de las operaciones?

  3. ¿Cambiará mi orden de operaciones de un idioma a otro?

Author: Bill the Lizard, 2010-02-15

6 answers

Los tutoriales de Java tienen una lista que ilustra la precedencia del operador . Los operadores de igualdad serán evaluados primero, luego &&, luego ||. Los paréntesis se evaluarán antes que cualquier otra cosa, por lo que agregarlos puede cambiar el orden. Esto suele ser prácticamente lo mismo de un idioma a otro, pero siempre es una buena idea volver a comprobarlo.

Son las pequeñas variaciones en el comportamiento que no esperas que pueden hacer que pases un día entero depurando, por lo que es una buena idea de poner los paréntesis en su lugar para que esté seguro de cuál será el orden de evaluación.

 55
Author: Bill the Lizard,
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
2010-02-15 02:08:23

Orden booleano de operaciones (en todos los idiomas creo):

  1. parens
  2. NO
  3. Y
  4. O

Así que tu lógica anterior es equivalente a:

(cat != null && cat.getColor() == "orange") || cat.getColor() == "grey"
 15
Author: Trey Hunner,
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
2010-02-15 02:05:41

La expresión es básicamente idéntica a:

if ( (cat != null && cat.getColor() == "orange") || cat.getColor() == "grey") {
  ...
}

El orden de precedencia aquí es que AND (&&) tiene mayor precedencia que OR (||).

También debe saber que usar == para probar la igualdad de cadenas a veces funciona en Java, pero no es así como debe hacerlo. Usted debe hacer:

if (cat != null && ("orange".equals(cat.getColor()) || "grey".equals(cat.getColor()))) {
  ...
}

Es decir, use los métodos equals() para la comparación String, no == que simplemente hace referencia a la igualdad. La igualdad de referencia para cadenas puede ser engañosa. Para ejemplo:

String a = new String("hello");
String b = new String("hello");
System.out.println(a == b); // false
 8
Author: cletus,
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
2010-02-15 02:51:27

Primero, su sentencia if contiene tres expresiones principales:

  1. cat != null
  2. cat.getColor () = = "orange"
  3. cat.getColor () = = "grey"

La primera expresión simplemente comprueba si cat no es null. Es necesario de lo contrario la segunda expresión se ejecutará y dará como resultado un NPE(null pointer excpetion). Es por eso que el uso de && entre la primera y segunda expresión. Cuando se usa &&, si la primera expresión se evalúa como false, la segunda expresión es nunca ejecutado. Finalmente se comprueba si el color del gato es gris.

Finalmente tenga en cuenta que su declaración if es todavía mal porque si el gato es null, la tercera expresión es todavía ejecutado y por lo tanto se obtiene un null excepción de puntero .

La forma correcta de hacerlo es:

if(cat != null && (cat.getColor() == "orange" || cat.getColor() == "grey")) { 
//do stuff 
} 

Compruebe el orden de los paréntesis.

 4
Author: Suraj Chandran,
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
2013-01-29 22:19:18

&& definitivamente se evalúa antes de ||. Pero veo que estás haciendo cat.getColor() == "orange" lo que podría darte un resultado inesperado. Es posible que desee esto en su lugar :

if(cat != null && ("orange".equals(cat.getColor()) || "grey".equals(cat.getColor()))) {
    //do stuff
}
 3
Author: fastcodejava,
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
2010-02-15 03:13:45

El orden de operación no es lo que necesita, necesita álgebra booleana, esto incluye funciones booleanas. Maxterms / minterms, código gris, tablas de Karnaugh, diodos, transistores, puertas lógicas, multiplexores, bitadders, chanclas... Lo que desea es implementar "lógica" booleana en equipos o máquinas virtuales. Con "orden de operaciones" usted puede referirse a algo acerca de la física como la gestión de los retrasos en las puertas lógicas (O, si) intervalos de nanosegundos?

 -3
Author: Kirschbaum,
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-06-27 04:49:00