example - my icon java
¿Corta y &=y |=cortocircuito en Java? (2)
No, |=
y &=
no cortocircuitan, porque son la versión de asignación compuesta de &
and |
, que no cortocircuitos.
JLS 15.26.2 Operadores de asignación de compuestos
Una expresión de asignación compuesta de la forma
E1 op= E2
es equivalente aE1 = (T)((E1) op (E2))
, dondeT
es el tipo deE1
, excepto queE1
se evalúa solo una vez.
Por lo tanto, asumiendo que boolean &
, la equivalencia para isFoobared &= methodWithSideEffects()
es:
isFoobared = isFoobared & methodWithSideEffects(); // no shortcircuit
Por otro lado, &&
y ||
haga shortcircuit, pero inexplicablemente Java no tiene una versión de asignación compuesta para ellos. Es decir, Java no tiene ni &&=
ni ||=
.
Ver también
- Operador de acceso directo "or-asignación" (| =) en Java
- ¿Cuál es la diferencia entre | y || en java?
- ¿Por qué Java no tiene versiones de asignación compuestas de los operadores condicionales y condicionales? (&& =, || =)
¿Qué es este negocio de corto circuito de todos modos?
La diferencia entre los operadores lógicos boolean
( &
y |
) en comparación con sus homólogos condicionales boolean
( &&
y ||
) es que los primeros no "cortocircuitan"; los últimos hacen. Es decir, asumiendo que no hay excepción, etc.
-
&
y|
siempre evaluar ambos operandos -
&&
y||
evaluar el operando correcto condicionalmente ; el operando correcto se evalúa solo si su valor podría afectar el resultado de la operación binaria. Eso significa que el operando correcto NO se evalúa cuando:- El operando izquierdo de
&&
evalúa afalse
- (porque no importa lo que evalúe el operando correcto, la expresión completa es
false
)
- (porque no importa lo que evalúe el operando correcto, la expresión completa es
- El operando izquierdo de
||
evalúa atrue
- (porque no importa lo que evalúe el operando correcto, toda la expresión es
true
)
- (porque no importa lo que evalúe el operando correcto, toda la expresión es
- El operando izquierdo de
Referencias
En otras palabras, ¿las siguientes dos afirmaciones se comportan de la misma manera?
isFoobared = isFoobared && methodWithSideEffects();
isFoobared &= methodWithSideEffects();
Me doy cuenta de que simplemente podría escribir una prueba, pero alguien puede saber esto de antemano, y otros pueden encontrar la respuesta útil.
No, no lo hacen, porque x &= y
es la abreviatura de x = x & y
y x |= y
es la abreviatura de x = x | y
x = x | y
Java no tiene operadores &&=
o ||=
que harían lo que quieres.
El &
y |
los operadores (junto con ~
, ^
, <<
, >>
y >>>
) son los operadores a nivel de bits . La expresión x & y
, para cualquier tipo integral, realizará una operación a nivel de bits . Del mismo modo, |
Realiza un bit a bit o. Para realizar una operación a nivel de bits, cada bit en el número se trata como un valor booleano, con 1
indica true
y 0
indica false
. Por lo tanto, 3 & 2 == 2
, ya que 3
es 0...011
en binario y 2
es 0...010
. Del mismo modo, 3 | 2 == 3
3 | 2 == 3
. Wikipedia tiene una buena explicación completa de los diferentes operadores. Ahora, para un booleano, creo que puedes salirte con &
y |
como equivalentes sin cortocircuito de &&
y ||
, pero no puedo imaginar por qué querrías hacerlo de todos modos.