¿Qué conjunto está en cortocircuito y qué significa exactamente que la expresión condicional compleja está en cortocircuito?
public static void main(String[] args) {
int x, y, z;
x = 10;
y = 20;
z = 30;
// T T
// T F
// F T
// F F
//SET A
boolean a = (x < z) && (x == x);
boolean b = (x < z) && (x == z);
boolean c = (x == z) && (x < z);
boolean d = (x == z) && (x > z);
//SET B
boolean aa = (x < z) & (x == x);
boolean bb = (x < z) & (x == z);
boolean cc = (x == z) & (x < z);
boolean dd = (x == z) & (x > z);
}
java
logical-operators
Aaron
fuente
fuente
Respuestas:
El
&&
y||
operadores "cortocircuitan", lo que significa que no evalúan el lado derecho si no es necesario.Los operadores
&
y|
, cuando se utilizan como operadores lógicos, siempre evalúan ambos lados.Solo hay un caso de cortocircuito para cada operador, y son:
false && ...
- no es necesario saber cuál es el lado derecho porque el resultado solo puede serfalse
independientemente del valor allítrue || ...
- no es necesario saber cuál es el lado derecho porque el resultado solo puede sertrue
independientemente del valor allíComparemos el comportamiento en un ejemplo simple:
La segunda versión usa el operador sin cortocircuito
&
y lanzará unNullPointerException
ifinput
isnull
, pero la primera versión regresaráfalse
sin excepción.fuente
SET A utiliza operadores booleanos de cortocircuito.
Lo que significa "cortocircuito" en el contexto de los operadores booleanos es que para un conjunto de valores booleanos b1, b2, ..., bn, las versiones de cortocircuito dejarán de evaluarse tan pronto como el primero de estos valores booleanos sea verdadero (|| ) o falso (&&).
Por ejemplo:
fuente
&&
,||
funciona de manera diferente y dejará de evaluarse en el primer operando que devuelva verdadero;)&&
,||
,&
y|
valorar izquierda a derecha. Para un conjunto de valores booleanos b1, b2, ..., bn, las versiones de cortocircuito dejarán de evaluarse cuando el primero de estos valores booleanos sea verdadero (||
) o falso (&&
). Bah, el principio está ahí;)Cortocircuito significa que el segundo operador no será verificado si el primer operador decide el resultado final.
Por ejemplo, la expresión es: Verdadero || Falso
En el caso de ||, todo lo que necesitamos es que uno de los lados sea Verdadero. Entonces, si el lado izquierdo es verdadero, no tiene sentido verificar el lado derecho y, por lo tanto, no se verificará en absoluto.
Del mismo modo, False && True
En el caso de &&, necesitamos que ambos lados sean verdaderos. Entonces, si el lado izquierdo es Falso, no tiene sentido verificar el lado derecho, la respuesta tiene que ser Falso. Y, por tanto, eso no se comprobará en absoluto.
fuente
Este tipo tendrá un cortocircuito, lo que significa que si se
(x < z)
evalúa como falso, este último no se evalúa,a
será falso, de lo contrario&&
también se evaluará(x == x)
.&
es un operador bit a bit, pero también un operador booleano AND que no cortocircuita.Puede probarlos con algo de la siguiente manera (vea cuántas veces se llama al método en cada caso):
fuente
&
es solo un operador bit a bit, pero eso no es cierto. Es también un "o" operador booleano.true & false
se evalúa como falso. ¿Puede explicar este "booleano" u "operador"? Puede ser que no entiendo lo que estás tratando de decir.AND
,OR
¡ no !true & false
es decir, es una sintaxis válida. -1 eliminado :)En términos sencillos, cortocircuitar significa detener la evaluación una vez que se sabe que la respuesta ya no puede cambiar. Por ejemplo, si está evaluando una cadena de
AND
s lógicas y descubre unFALSE
en el medio de esa cadena, sabe que el resultado será falso, sin importar cuáles sean los valores del resto de las expresiones en la cadena. Lo mismo ocurre con una cadena deOR
s: una vez que descubre aTRUE
, sabe la respuesta de inmediato y, por lo tanto, puede omitir la evaluación del resto de las expresiones.Indicas a Java que quieres un cortocircuito usando en
&&
lugar de&
y en||
lugar de|
. El primer conjunto de tu publicación es un cortocircuito.Tenga en cuenta que esto es más que un intento de ahorrar algunos ciclos de CPU: en expresiones como esta
cortocircuito significa una diferencia entre el funcionamiento correcto y un bloqueo (en el caso de que mystring sea nulo).
fuente
Java proporciona dos operadores booleanos interesantes que no se encuentran en la mayoría de los otros lenguajes informáticos. Estas versiones secundarias de AND y OR se conocen como operadores lógicos de cortocircuito. . Como puede ver en la tabla anterior, el operador OR da como resultado verdadero cuando A es verdadero, sin importar lo que sea B.
De manera similar, el operador AND da como resultado falso cuando A es falso, sin importar lo que sea B. Si usa los formularios
||
y&&
, en lugar de|
y&
formas de estos operadores, Java no se molestará en evaluar solo el operando de la derecha. Esto es muy útil cuando el operando de la derecha depende de que el de la izquierda sea verdadero o falso para funcionar correctamente.Por ejemplo, el siguiente fragmento de código muestra cómo puede aprovechar la evaluación lógica de cortocircuito para asegurarse de que una operación de división será válida antes de evaluarla:
Dado que
&&
se usa la forma de cortocircuito de AND ( ), no hay riesgo de causar una excepción en tiempo de ejecución de dividir por cero. Si esta línea de código se escribiera usando la&
versión única de AND, ambos lados tendrían que ser evaluados, provocando una excepción en tiempo de ejecución cuandodenom
es cero.Es una práctica estándar usar las formas de cortocircuito de Y y O en casos que involucran lógica booleana, dejando las versiones de un solo carácter exclusivamente para operaciones bit a bit. Sin embargo, hay excepciones para esta regla. Por ejemplo, considere la siguiente declaración:
Aquí, el uso de un solo
&
asegura que la operación de incremento se aplicará ae
sic
es igual a 1 o no.fuente
OR lógico: devuelve verdadero si al menos uno de los operandos se evalúa como verdadero. Ambos operandos se evalúan antes de aplicar el operador OR.
O cortocircuito: - si el operando del lado izquierdo devuelve verdadero, devuelve verdadero sin evaluar el operando del lado derecho.
fuente
Hay un par de diferencias entre los operadores
&
y&&
. Las mismas diferencias se aplican a|
y||
. Lo más importante a tener en cuenta es que&&
es un operador lógico que solo se aplica a operandos booleanos, mientras que&
es un operador bit a bit que se aplica tanto a tipos enteros como a booleanos.Con una operación lógica, puede hacer un cortocircuito porque en ciertos casos (como el primer operando de
&&
serfalse
, o el primer operando de||
sertrue
), no necesita evaluar el resto de la expresión. Esto es muy útil para hacer cosas como verificarnull
antes de acceder a un archivo o método, y verificar posibles ceros antes de dividir por ellos. Para una expresión compleja, cada parte de la expresión se evalúa de forma recursiva de la misma manera. Por ejemplo, en el siguiente caso:Solo se evaluarán las partes destacadas. Para calcular el
||
, primero verifique si7 == 8
estrue
. Si lo fuera, el lado derecho se omitiría por completo. El lado derecho solo verifica si lo1 == 3
esfalse
. Dado que lo es,4 == 4
no es necesario verificarlo y toda la expresión se evalúa comofalse
. Si el lado izquierdo fueratrue
, por ejemplo, en7 == 7
lugar de7 == 8
, se omitiría todo el lado derecho porque la||
expresión completa seríatrue
independientemente.Con una operación bit a bit, necesita evaluar todos los operandos porque en realidad solo está combinando los bits. Los booleanos son efectivamente un entero de un bit en Java (independientemente de cómo funcionen los internos), y es solo una coincidencia que pueda hacer cortocircuitos para operadores bit a bit en ese caso especial. La razón por la que no puede cortocircuitar un entero
&
u|
operación general es que algunos bits pueden estar activados y otros desactivados en cualquiera de los operandos. Algo como1 & 2
produce cero, pero no tiene forma de saberlo sin evaluar ambos operandos.fuente
Dado que se usa la forma de cortocircuito de AND (&&), no hay riesgo de causar una excepción en tiempo de ejecución cuando demon es cero.
Árbitro. Java 2 Quinta edición por Herbert Schildt
fuente