Capítulo 002 Ejercicio 007 (Corto Circuito)

// Demuestra el comportamiento de los cortocircuitos con operadores lógicos.

/** Al manipular los operadores lógicos se pueden entrar en un fenómeno de "cortocircuito". Esto
* significa que la expresión se evaluará únicamente hasta que se pueda determinar sin ambigüedad la
* certeza o falsedad de toda la expresión. Como resultado, podría ocurrir que no sea necesario evaluar
* todas las partes de la expresión lógica.
*
* Cada test lleva a cabo una comparación con el argumento pasado y devuelve verdadero o falso. También
* imprime información para mostrar lo que está invocando. Las comprobaciones se usan en la expresión:
*
* if(prueba1(0) && prueba2(2) && prueba3(3))
*
* Naturalmente uno podría pensar que se ejecutarían las tres pruebas, pero en la salida se muestra de
* otra forma:
*
* prueba1(0)
* resultado: true
* prueba2(2)
* resultado: false
* La expresión es falsa
*
* La primera prueba produjo un resultado verdadero, de forma que la evaluación de la expresión
* continúa. Sin embargo, el segundo test produjo un resultado falso. Puesto que esto significa
* que toda la expresión va a ser falso ¿por qué continuar evaluando el resto de la expresión?
* Podría ser costoso. Ésa es precisamente la razón para hacer un cortocircuito; es posible lograr un
* incremento potencial de rendimiento si no es necesario evaluar todas las partes de la expresión lógica.
*/
public class CortoCircuito{

static boolean prueba1(int val){
System.out.println("prueba1(" + val + ")");
System.out.println("resultado: " + (val < 1));
return val < 1;
}

static boolean prueba2(int val){
System.out.println("prueba2(" + val + ")");
System.out.println("resultado: " + (val < 2));
return val < 2;
}

static boolean prueba3(int val){
System.out.println("prueba3(" + val + ")");
System.out.println("resultado: " + (val < 3));
return val < 3;
}

public static void main(String[] args){
if(prueba1(0) && prueba2(2) && prueba3(3))
System.out.println("La expresión es verdadera");
else
System.out.println("La expresión es falsa");
}

}

Comentarios

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de cfpmx

Perfecto, añadiéndole un

Perfecto, añadiéndole un poquito mas de información cultural a tu entrada, podemos utilizar los operadores |, & con estos se obtendrán los mismo resultados, pero obliga a hacer las comparaciones de ambos lados. ¿Cuál es el chiste? Aún no lo sé, probablemente algún día lo puedan requerir, aunque estos operadores que pongo, no son tan eficientes como || y &&.

Imagen de ezamudio

bitwise

| & y ^ son operadores que operan sobre bits, no comparadores.

1 | 3 = 3
1 & 3 = 1
1 ^ 3 = 2

Los puedes usar sobre booleans en un if porque finalmente van a ser operaciones como true | false y se evalua el resultado de la operación, por eso es que parece que se evalúan de los dos lados, porque son operadores binarios (en el sentido de que necesitan dos operandos). No son comparadores.

Imagen de cfpmx

Bueno creo que cometí un

Bueno creo que cometí un error al decir comparaciones, lo que realmente quise decir son evaluaciones. Osea, los operadores | y & obligan a evaluar ambos lados de la expresión a diferencia de los operadores || y &&.

Como mencionas los operadores | y & operan sobre bits, pero tambien son utilizados como operadores lógicos de no corto circuito.