Operador ternário em Java avaliando apenas uma expressão desde Java 7 - isso era diferente em Java 1.6 e inferior?


109

Preparando-me para o exame Oracle Certified Associate Java SE 8 Programmer 1, encontrei o seguinte parágrafo sobre a expressão ternária no Guia de Estudo oficial:

Avaliação da expressão ternária A
partir do Java 7, apenas uma das expressões à direita do operador ternário será avaliada em tempo de execução. De maneira semelhante aos operadores de curto-circuito, se uma das duas expressões da mão direita em um operador ternário executar um efeito colateral, então ela não pode ser aplicada em tempo de execução. Vamos ilustrar esse princípio com o seguinte exemplo: [...]

Diz que apenas uma das duas expressões é avaliada, demonstrando com o seguinte exemplo:

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

Aqui, apenas yincrementa, mas znão, como seria de esperar.

O que estou descobrindo é o início do parágrafo (marcado em amarelo) onde diz "As of Java 7, ...". Testei o mesmo código com Java 1.6 e não consigo encontrar diferença no comportamento. Eu esperava que o Java 1.6 avaliasse ambas as expressões apenas a partir das informações fornecidas no parágrafo. Alguém tem uma ideia do que eles queriam dizer com "As of Java 7, ..."?

Edit: Para evitar confusão: Resume-se à pergunta, uma vez que escrevem 'As of Java 7', houve algo que mudou em relação ao operador ternário, ao mudar de Java 6 para Java 7?


4
Por que você espera que z também seja aumentado? Isso não faz sentido para mim.
— Jiří Kantor,

15
parece um livro mal escrito, os operadores ternários não mudaram desde o início de java, afaik
— NimChimpsky,

23
Lendo a maioria das respostas postadas até agora, as pessoas parecem interpretar mal a pergunta. Não é "Por que as duas expressões não são avaliadas?", Mas sim "Por que este livro aparentemente sugere que costumava se comportar de maneira diferente?"
— BambooleanLogic

23
Na verdade, eu vi que "Na data / versão X" costumava significar "Verificamos se isso é verdade na data / na versão X, mas não estamos dizendo nada sobre as versões anteriores." Acho que esse pode ser o significado aqui. (Embora você pense que seria fácil verificar as versões anteriores do Java.) De qualquer forma, isso é mais uma questão em inglês do que em programação.
— David Z de

14
@DavidZ: Problemas de inglês são problemas de programação quando eles o impedem de realizar seu trabalho. Este comentário mal formulado fez o OP parar o que estava fazendo e perder tempo descobrindo que NADA MUDOU. Programação é comunicação, para o compilador / interpretador e para quem vier depois para manter o seu código. Não consigo contar as vezes que li algum código e tive que parar por causa de algo estranho que / poderia / ter tido algo a ver com o problema, apenas para descobrir que estava apenas mal "formulado".
— jmoreno de

Respostas:


92

Sou um dos autores do livro de onde veio isso. Embora eu não tenha escrito essa frase específica, concordo que a intenção era "isso foi testado em Java 7". Vou fazer uma anotação para remover isso se escrevermos outra edição.

Para ser claro, o operador ternário se comportou da mesma maneira em Java 8, 7, 6, etc. E eu ficaria muito surpreso se ele mudasse no futuro.


116

Do Java 6 JLS :

Em tempo de execução, a primeira expressão de operando da expressão condicional é avaliada primeiro; se necessário, a conversão de unboxing é executada no resultado; o valor booleano resultante é então usado para escolher a segunda ou a terceira expressão do operando:

  • Se o valor do primeiro operando for verdadeiro, a segunda expressão do operando será escolhida.
  • Se o valor do primeiro operando for falso, a expressão do terceiro operando será escolhida.

A expressão do operando escolhida é então avaliada e o valor resultante é convertido para o tipo da expressão condicional conforme determinado pelas regras declaradas acima. Esta conversão pode incluir boxing (§5.1.7) ou conversão de unboxing. A expressão do operando não escolhida não é avaliada para essa avaliação particular da expressão condicional.

Redação semelhante também aparece nas edições JLS desde a versão 1.0 . O comportamento não mudou no Java 7; o guia de estudo está mal redigido.


2
Portanto, a resposta é "Não há diferença a partir do Java 7 em relação ao operador ternário", certo?
— Mathias Bader,

5
Parece legítimo. Escrevi um memorando para os autores - ansioso pela resposta deles
— Mathias Bader,

Você também pode provavelmente encontrar um URL que compare o código do operador entre as versões. Se você é paranóico / curioso.
— Steve Clay

7
O número de perguntas mal escritas (ou simplesmente erradas) nessas certificações Oracle é sempre surpreendente novamente.
— Voo
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.