new icon example borderfactory java short-circuiting

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 a E1 = (T)((E1) op (E2)) , donde T es el tipo de E1 , excepto que E1 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

¿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 a false
      • (porque no importa lo que evalúe el operando correcto, la expresión completa es false )
    • El operando izquierdo de || evalúa a true
      • (porque no importa lo que evalúe el operando correcto, toda la expresión es true )

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.