operator java logic boolean evaluation operator-precedence

java operators



En Java, ¿cuáles son el "orden de operaciones" booleano? (6)

Tomemos un ejemplo simple de un objeto Cat . Quiero estar seguro de que el cat "no nulo" sea naranja o gris.

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

Yo creo Y viene primero, luego el OR. Aunque estoy un poco confuso, así que aquí están mis preguntas:

  1. ¿Alguien me puede guiar a través de esta declaración y estoy seguro de que entiendo lo que sucede?

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

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


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


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

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

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

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

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

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

String a = new String("hello"); String b = new String("hello"); System.out.println(a == b); // false


Los Tutoriales de Java tienen una lista que ilustra la prioridad del operador . Los operadores de igualdad serán evaluados primero, luego && , luego || . Los paréntesis se evaluarán antes que nada, por lo que agregarlos puede cambiar el orden. Por lo general, esto es casi lo mismo de un idioma a otro, pero siempre es una buena idea volver a verificar.

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


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

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

Entonces tu lógica anterior es equivalente a:

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


Primero, tu sentencia if contiene tres expresiones principales:

  1. cat! = null
  2. cat.getColor () == "naranja"
  3. cat.getColor () == "gris"

La primera expresión simplemente comprueba si cat no es nulo. De lo contrario, es necesario que la segunda expresión se ejecute y dé como resultado un NPE(null pointer excpetion) . Por eso el uso de && entre la primera y la segunda expresión. Cuando usa && , si la primera expresión se evalúa como falsa, la segunda expresión nunca se ejecuta. Finalmente verificas si el color del gato es gris.

Finalmente, tenga en cuenta que su sentencia if todavía es incorrecta porque si cat es nulo, la tercera expresión aún se ejecuta y, por lo tanto, obtiene una excepción de puntero nulo .

La forma correcta de hacerlo es:

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

Compruebe el orden de paréntesis.


Yeah && es definitivamente evaluado antes de || . Pero veo que estás haciendo cat.getColor() == "orange" 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 }