Operadores lógicos - 1

"¡Hola, amigo!"

"Ahora tendremos una pequeña lección sobre operadores lógicos".

"¿Qué operadores lógicos conoces?"

— O (||), Y (&&), NO (!)

"Sí. Buen trabajo. ¿Y recuerdas cómo funcionan?"

"Sí."

"OR produce verdadero cuando al menos un operando es verdadero".

"Y da como resultado verdadero cuando ambos operandos son verdaderos".

"NO cambia verdadero a falso y falso a verdadero".

"Así es. ¿Y en qué orden se evalúan los operadores en esta expresión?"

boolean a = true;
boolean b = false;
boolean c = true;

boolean result = a && b || !c && b || !a;

"Todo esto es muy simple".

"Primero, NOT (!), luego AND (&&), y luego OR (||) al final".

Si añadimos paréntesis, obtendríamos:

boolean a = true;
boolean b = false;
boolean c = true;

boolean result = (a && b) || ((!c) && b) || (!a);

"Eso es todo correcto, bien hecho. ¿Y cuál es el resultado?"

— 1) (a && b) == (verdadero && falso) == falso

2) ((!c) && b) == (falso && falso) == falso

3) (!a) == falso

4) falso || falso || falso == falso

"El resultado es falso".

"Parece que conoces el tema perfectamente. Entonces te contaré un par de pequeños secretos".

"Primero, las expresiones lógicas se evalúan de izquierda a derecha".

"Segundo, aquí se usa la evaluación de cortocircuito (los cálculos se realizan solo si es necesario). Si el resultado final ya se conoce al evaluar parte de la expresión, entonces el resto de la expresión no se evalúa".

Ejemplo
boolean result = (true && false) || (true && true) || (true && false);

"Esta expresión se divide en tres partes separadas por el operador OR (||)".

"Si al menos una parte es verdadera, entonces la respuesta es verdadera y no es necesario considerar nada más. En consecuencia, la expresión se evalúa así:"

1)  Evalúa la primera parte:  (verdadero && falso) == falso

2)  Evalúa la segunda parte:  (verdadero && verdadero) == verdadero

3) No evaluamos la tercera parte, ya que está claro que la respuesta será verdadera .

"Este enfoque también se llama evaluación perezosa".

"Está bien. ¿Y qué tiene de especial?"

"Nada, hasta que comience a llamar a los métodos dentro de la expresión. Si se omite parte de la expresión, no se llamará a los métodos en la parte omitida".

"Pero este enfoque se ha vuelto muy común. He aquí por qué:"

Ejemplo:
Job job = null;

if (job != null && job.isDone())
{
…
}

"Si el trabajo es nulo cuando se evalúa la expresión, entonces la llamada job.isDone() no sucederá".

"De hecho, la primera parte de la expresión es falsa, seguida de AND (&&). Por lo tanto, se sabrá que toda la expresión es falsa y la segunda parte no será necesaria".

"Exactamente. Es una buena técnica, ¿verdad?"

"Sí."