float convertir java operators specifications boolean-expression compound-assignment

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?



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 a E1 = (T) ((E1) op (E2)) , donde T es el tipo de E1 , excepto que E1 se evalúa solo una vez.

15.22.2. Operadores lógicos booleanos & , ^ , y |

Cuando ambos operandos de a,, ^ o | los operadores son de tipo boolean o Boolean , entonces el tipo de expresión del operador a nivel de bits es boolean . 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 operandos boolean o Boolean . 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 .