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 ?
Sí. El texto estándar establece los valores para ambos valores de operando, es decir, ambas expresiones deben ser evacuadas. – rsp