convertir - Java booleano |=operador
convertir string a float java (5)
Recientemente vi un código usando esto:
boolean val = something();
val |= somethingElse();
La parte interesante es el operador | = (binario como) hecho en el tipo primitivo booleano.
Me sorprendió que | = existiera para boolean, como si fuera un tipo entero, y buscó la especificación de Java para este operador, pero no pudo encontrar ninguna.
Sería curioso si el operando derecho se evalúa si el valor izquierdo ya es verdadero.
¿Puede alguien apuntarme a la especificación de Java de esto?
Consulte http://docs.oracle.com/javase/specs/jls/se5.0/html/expressions.html#15.22.2 para obtener la definición de |
. Consulte http://docs.oracle.com/javase/specs/jls/se5.0/html/expressions.html#15.26.2 para la definición de |=
. Las definiciones son justo lo que usted pensaría.
Lo que me sorprende es la falta de un operador ||=
.
Desde el 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.15.22.2. Operadores lógicos booleanos
&
,^
, y|
Cuando ambos operandos de a,,
^
o|
los operadores son de tipoboolean
oBoolean
, entonces el tipo de expresión del operador a nivel de bits esboolean
. En todos los casos, los operandos están sujetos a conversión unboxing (§5.1.8) según sea necesario.Para
|
, el valor del resultado es falso si los valores de ambos operandos son falsos; De lo contrario, el resultado es verdadero.
Esto significa que
val |= somethingElse();
es estrictamente equivalente a
val = val | somethingElse();
(asumiendo que somethingElse()
Else somethingElse()
devuelve boolean
o Boolean
).
Sería curioso si el operando de la derecha se evalúa si el valor de la izquierda ya es verdadero.
Sí, sería evaluado, ya que |
no cortocircuito:
15.7.2. Evaluar los operandos antes de la operación
El lenguaje de programación Java garantiza que todos los operandos de un operador (excepto los operadores condicionales
&&
,||
y? :
&&
evaluarse por completo antes de que se realice cualquier parte de la operación.15.24. Condicional-o Operador
||
Por lo tanto,
||
calcula el mismo resultado que|
En operandosboolean
oBoolean
. Sólo difiere en que la expresión del operando de la derecha se evalúa condicionalmente en lugar de siempre.
Los operadores lógicos a nivel de bits tendrán el mismo efecto que los operadores lógicos "normales" en los valores booleanos.
De la especificación de lenguaje Java 15.22:
Cuando ambos operandos de a,, ^ o | los operadores son de tipo booleano o booleano, entonces el tipo de expresión del operador a nivel de bits es booleano. En todos los casos, los operandos están sujetos a conversión unboxing (§5.1.8) según sea necesario.
Para &, el valor del resultado es verdadero si los valores de ambos operandos son verdaderos; De lo contrario, el resultado es falso.
Para ^, el valor del resultado es verdadero si los valores del operando son diferentes; De lo contrario, el resultado es falso.
Para |, el valor del resultado es falso si ambos valores de operando son falsos; De lo contrario, el resultado es verdadero.
La única diferencia real es que los operadores bit a bit no se pueden usar para evaluar el cortocircuito.
Por ejemplo, este código lanzará NullPointerException
:
Boolean b1 = new Boolean(true);
Boolean b2 = null;
if (b1 || b2) {
//no null pointer here;
}
if (b1 | b2) {
//null pointer here;
}
No es binario, es una declaración lógica "O" significa
val |= {something else}
es igual que la expresión booleana:
val == val or {something else}
que es inclusivo o (el regular o usado en expresiones matemáticas y ciencias de la computación)
En algunos lenguajes de programación o se nota por dos || signos y en algunos por uno | Uno de ellos es SQL y todos los lenguajes de base de datos que conozco de DTD JSON, etc.
>>I''d be curious if right operand is evaluated if left value already is true.
Los operadores bitwise (como |
, &
, ..) evalúan ambos lados, antes de completarse.
Los operadores lógicos (como &&
, ||
, ..) pueden omitir la evaluación de la segunda parte en algunos casos. Esto se llama short-circuit
.