2012-02-13 12 views
5

Esto está directamente inspirado en this question.
Existen numerosas referencias/declaraciones de que los operadores bit a bit, cuando se aplican a booleanos, no provocarán un cortocircuito. En otras palabras, boolean a = f() & g(), donde f() y g() ambos devuelven boolean, ambos siempre serán evaluados.
Sin embargo, JLS dice solamente:¿Qué (en las especificaciones) garantiza que los operadores lógicos que no sean de cortocircuito no se cortocircuitarán?

15.22.2 operadores lógicos booleanos &,^y |
Cuando ambos operandos de &, ^, o | operator son de tipo boolean o Boolean, entonces el tipo de la expresión de operador bit a bit es booleana. En todos los casos, los operandos están sujetos a la conversión de unboxing (§5.1.8) según sea necesario.

Para &, el valor del resultado es verdadero si ambos valores del operando 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 del operando son falsos; de lo contrario, el resultado es verdadero.

¿Cómo esto garantiza que ambos operandos son realmente evaluados? Además de xor, aún puede romper y devolver el resultado si uno de los argumentos (y puede ser segundo/derecho siendo el primero en ser evaluado) viola la condición.
Por ejemplo. a & b solo necesitaría evaluar b como falso para evaluar la expresión como falsa.

Tenga en cuenta: No estoy preguntando si se implementa de esta manera (no cortocircuito), ciertamente lo es.

lo que pido:

manera la ejecución con cortocircuito violar norma lenguaje ?

+0

Sí. El texto estándar establece los valores para ambos valores de operando, es decir, ambas expresiones deben ser evacuadas. – rsp

Respuesta

4

Ver JLS 15.7.2 Evaluate Operands before Operation

El lenguaje de programación Java también garantiza que cada operando de un operador (excepto los operadores condicionales & &, ||, y? :) parece ser completamente evaluado antes de que cualquier parte de la operación sí mismo se realiza.

Así que si usted tiene el operador &, ambos operandos deben ser evaluados antes de que se calcula el resultado final.

Además, la sección anterior a esa explícitamente solicita que el operando izquierdo de cualquier operador binario necesite ser evaluado primero.

+0

¡Buena captura! ¡Gracias! – wmz

+0

Cuenta conmigo impresionado por _finding_ esta sección. –

1

El JLS declara explícitamente que el acceso directo se realiza para condicional -y el condicional- y. Explica el comportamiento del condicional-o/y en términos de los operadores bit a bit y/o. Entonces, se enfatiza que el atajo es una variación en el comportamiento de los operadores bit a bit.

Entonces, yo diría que el uso de atajos podría violar el estándar. Definitivamente violaría las expectativas de los desarrolladores.

15.24 Conditional-Or Operator ||

El operador & & es como & (§15.22.2), pero evalúa su operador de la derecha sólo si el valor de su operando de la izquierda es cierto.

Cuestiones relacionadas