Pregunta

Vamos a dar un ejemplo sencillo de un Cat objeto. Quiero estar seguro de que el cat "no nulo" es naranja o gris.

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

Creo y viene primero, luego el quirófano. Estoy un poco borrosa, sin embargo, así que aquí están mis preguntas:

  1. Puede alguien caminar a través de esta declaración, así que estoy seguro de que consiga lo que sucede?

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

  3. ¿Mi orden de las operaciones cambiar de un idioma a otro?

¿Fue útil?

Solución

El Tutoriales de Java tiene una lista ilustrando la precedencia de operadores . Los operadores de igualdad serán evaluados en primer lugar, a continuación, &&, entonces ||. Los paréntesis se evalúan antes que cualquier otra cosa, por lo que la adición de ellos pueden cambiar el orden. Esto es por lo general más o menos lo mismo de un idioma a otro, pero siempre es una buena idea revisar de nuevo.

Es las pequeñas variaciones en el comportamiento que no esperas que puede causar a pasar toda una depuración día, así que es una buena idea poner los paréntesis en su lugar por lo que está seguro de cuál será el orden de evaluación.

Otros consejos

Para booleano de operaciones (en todos los idiomas, creo):

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

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

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

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 Y (&&) tiene mayor precedencia que OR (||).

También debe saber que el uso == para comprobar la igualdad de Cadenas a veces trabajo en Java, pero no es la forma en que debe hacerlo. Que debe hacer:

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

es decir, utilizar los métodos equals() para la comparación String, no == que simplemente hace la igualdad de referencia. 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

&& está definitivamente evaluado antes ||. Pero veo que está haciendo cat.getColor() == "orange" que podría dar resultado inesperado. Es posible que desee a este lugar:

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

En primer lugar, si su declaración contiene tres expresiones principales:

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

La primera expresión simplemente comprueba si el gato no es nulo. Su necesaria de lo contrario el la segunda expresión conseguirá ejecutado y dará lugar a un NPE(null pointer excpetion). Es por eso que el uso de && entre la primera y la segunda expresión. Cuando se utiliza &&, si la primera expresión se evalúa como falsa la segunda expresión nunca se ejecuta. Por último, comprobar si el color del gato es gris.

  

Por último destacar que su sentencia if es   Todavía mal porque si es gato   null, la tercera expresión es todavía   ejecutado y por lo tanto se obtiene un nula   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.

orden de la operación no es lo que necesita, necesita álgebra de Boole, esto incluye funciones booleanas. Maxterms / términos producto, código Gray, tablas de Karnaugh, diodos, transistores, puertas lógicas, multiplexores, bitadders, chanclas ... Lo que se quiere es poner en práctica la "lógica" booleano en ordenadores o máquinas virtuales. Con "orden de operaciones" se puede referir algo acerca de la física como la gestión de los retrasos en las puertas lógicas (o, si) nanosegundos intervalos?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top