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= E2es equivalente aE1 = (T)((E1) op (E2)), dondeTes el tipo deE1, excepto queE1se 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.