El operador ternario en Java solo evalúa una expresión desde Java 7: ¿era eso diferente en Java 1.6 y versiones anteriores?

109

Al prepararme para el examen de Programador 1 de Java SE 8 Certified Associate de Oracle, encontré el siguiente párrafo sobre la expresión ternaria en la Guía de estudio oficial:

Evaluación de expresiones ternarias
A partir de Java 7, solo una de las expresiones de la derecha del operador ternario se evaluará en tiempo de ejecución. De manera similar a los operadores de cortocircuito, si una de las dos expresiones de la derecha en un operador ternario produce un efecto secundario, entonces no se puede aplicar en tiempo de ejecución. Ilustremos este principio con el siguiente ejemplo: [...]

Dice que solo se evalúa una de las dos expresiones, demostrando con el siguiente ejemplo:

int y = 1;
int z = 1;
int a = y < 10 ? y++ : z++;

Aquí, solo se yincrementa, pero zno, como era de esperar.

Con lo que me tropiezo es con el comienzo del párrafo (marcado en amarillo) donde dice "A partir de Java 7, ...". Probé el mismo código con Java 1.6 y no puedo encontrar una diferencia en el comportamiento. Esperaba que Java 1.6 evaluara ambas expresiones solo a partir de la información proporcionada en el párrafo. ¿Alguien tiene una idea de lo que quería decir con "A partir de Java 7, ..."?

Editar: Para evitar confusiones: se reduce a la pregunta, ya que escriben 'A partir de Java 7', ¿hubo algo que cambió con respecto al operador ternario, al cambiar de Java 6 a Java 7?

Mathias Bader
fuente
4
¿Por qué esperaría que z también aumentara? Esto no tiene ningún sentido para mí.
Jiří Kantor
15
suena como un libro mal escrito, los operadores ternarios no han cambiado desde el comienzo de java, afaik
NimChimpsky
23
Al leer la mayoría de las respuestas publicadas hasta ahora, la gente parece malinterpretar la pregunta. No es "¿Por qué no se evalúan ambas expresiones?", Sino más bien "¿Por qué este libro aparentemente implica que solía comportarse de manera diferente?"
BambooleanLogic
23
En realidad, he visto que "A partir de la fecha / versión X" solía significar "Verificamos que esto sea cierto en la fecha / en la versión X, pero no estamos diciendo nada sobre versiones anteriores". Supongo que ese puede ser el significado aquí. (Aunque pensaría que sería bastante fácil comprobar versiones anteriores de Java). De todos modos, es más un problema de inglés que de programación.
David Z
14
@DavidZ: Los problemas de inglés son problemas de programación cuando le impiden hacer su trabajo. Este comentario mal redactado hizo que el OP detuviera lo que estaba haciendo y perdiera el tiempo descubriendo que NADA HA CAMBIADO. La programación es comunicación, para el compilador / intérprete y para quien venga más tarde para mantener su código. No puedo contar las veces que he estado leyendo algún código y tuve que parar por algo extraño que / podría / haber tenido algo que ver con el problema, solo para descubrir que estaba mal "redactado".
jmoreno

Respuestas:

92

Soy uno de los autores del libro del que vino esto. Si bien no escribí esa oración en particular, estoy de acuerdo en que la intención era "esto se probó en Java 7". Tomaré una nota para eliminar eso si escribimos otra edición.

Para ser claros, el operador ternario se ha comportado de la misma manera en Java 8, 7, 6, etc. Y me sorprendería bastante si cambiara en el futuro.

Jeanne Boyarsky
fuente
116

Desde Java 6 JLS :

En tiempo de ejecución, la primera expresión de operando de la expresión condicional se evalúa primero; si es necesario, la conversión de unboxing se realiza en el resultado; el valor booleano resultante se usa para elegir la segunda o la tercera expresión de operando:

  • Si el valor del primer operando es verdadero, entonces se elige la expresión del segundo operando.
  • Si el valor del primer operando es falso, entonces se elige la expresión del tercer operando.

La expresión de operando elegida se evalúa y el valor resultante se convierte al tipo de expresión condicional según lo determinado por las reglas establecidas anteriormente. Esta conversión puede incluir conversión de boxeo (§5.1.7) o unboxing. La expresión de operando no elegida no se evalúa para esa evaluación particular de la expresión condicional.

También aparece una redacción similar en las ediciones de JLS que se remontan a la 1.0 . El comportamiento no cambió en Java 7; la guía de estudio está mal redactada.

user2357112 es compatible con Monica
fuente
2
Entonces, la respuesta es "No hay ninguna diferencia a partir de Java 7 y antes, con respecto al operador ternario", ¿verdad?
Mathias Bader
5
Parece legitimo. Escribí un memorando a los autores - esperando su respuesta
Mathias Bader
Probablemente también pueda encontrar una URL que compare el código del operador entre versiones. Si eres paranoico / curioso.
Steve Clay
7
El número de preguntas mal escritas (o simplemente incorrectas) en estas certificaciones de Oracle es asombroso cada vez más.
Voo