Operatore ternario in Java che valuta solo un'espressione da Java 7: era diverso in Java 1.6 e versioni precedenti?


109

Preparandomi per l'esame Oracle Certified Associate Java SE 8 Programmer 1, mi sono imbattuto nel seguente paragrafo sull'espressione ternaria nella Guida allo studio ufficiale:

Valutazione delle espressioni ternarie
A partire da Java 7, solo una delle espressioni a destra dell'operatore ternario verrà valutata in fase di runtime. In un modo simile agli operatori di cortocircuito, se una delle due espressioni di destra in un operatore ternario esegue un effetto collaterale, potrebbe non essere applicato in fase di esecuzione. Illustriamo questo principio con il seguente esempio: [...]

Dice che viene valutata solo una delle due espressioni, dimostrando con il seguente esempio:

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

Qui, yaumenta solo , ma znon come ci si aspetterebbe.

Quello in cui mi imbatto è l'inizio del paragrafo (contrassegnato in giallo) dove si dice "A partire da Java 7, ...". Ho testato lo stesso codice con Java 1.6 e non riesco a trovare differenze nel comportamento. Mi aspettavo che Java 1.6 valutasse entrambe le espressioni solo dalle informazioni fornite nel paragrafo. Qualcuno ha idea di cosa volessero dire con "A partire da Java 7, ..."?

Modifica: per evitare confusione: si riduce alla domanda, dal momento che scrivono "A partire da Java 7", è stato cambiato qualcosa riguardo all'operatore ternario, quando si passa da Java 6 a Java 7?


4
Perché ti aspetti che anche z aumenti? Questo non ha alcun senso per me.
Jiří Kantor

15
suona come un libro scritto male, gli operatori ternari non sono cambiati dall'inizio di java,
afaik

23
Leggendo la maggior parte delle risposte pubblicate finora, le persone sembrano interpretare male la domanda. Non è "Perché entrambe le espressioni non vengono valutate?", Ma piuttosto "Perché questo libro sembra implicare che si comportava in modo diverso?"
BambooleanLogic

23
In realtà, ho visto che "Alla data / versione X" significava "Abbiamo verificato che questo sia vero alla data / alla versione X ma non stiamo dicendo nulla sulle versioni precedenti". Immagino che questo possa essere il significato qui. (Anche se penseresti che sarebbe abbastanza facile controllare le versioni precedenti di Java.) Comunque, questo è più un problema inglese che di programmazione.
David Z

14
@DavidZ: I problemi in inglese sono problemi di programmazione quando ti impediscono di portare a termine il tuo lavoro. Questo commento mal formulato ha indotto l'OP a interrompere ciò che stava facendo e a perdere tempo a scoprire che NULLA È CAMBIATO. La programmazione è comunicazione, al compilatore / interprete ea chi viene dopo per mantenere il tuo codice. Non riesco a contare le volte che ho letto del codice e mi sono dovuto fermare a causa di qualcosa di strano che / avrebbe potuto / aver avuto qualcosa a che fare con il problema, solo per scoprire che era solo "formulato" male.
jmoreno

Risposte:


92

Sono uno degli autori del libro da cui proviene. Sebbene non abbia scritto quella frase in particolare, sono d'accordo che l'intento era "questo è stato testato su Java 7". Farò una nota per rimuoverlo se scriviamo un'altra edizione.

Per essere chiari, l'operatore ternario si è comportato allo stesso modo in Java 8, 7, 6, ecc. E sarei piuttosto sorpreso se cambiasse in futuro.


116

Da Java 6 JLS :

In fase di esecuzione, viene valutata per prima la prima espressione di operando dell'espressione condizionale; se necessario, viene eseguita la conversione unboxing sul risultato; il valore booleano risultante viene quindi utilizzato per scegliere la seconda o la terza espressione dell'operando:

  • Se il valore del primo operando è vero, viene scelta la seconda espressione dell'operando.
  • Se il valore del primo operando è falso, viene scelta la terza espressione dell'operando.

L'espressione dell'operando scelta viene quindi valutata e il valore risultante viene convertito nel tipo di espressione condizionale come determinato dalle regole sopra indicate. Questa conversione può includere la conversione in box (§5.1.7) o unboxing. L'espressione dell'operando non scelta non viene valutata per quella particolare valutazione dell'espressione condizionale.

Una formulazione simile compare anche nelle edizioni JLS che risalgono alla 1.0 . Il comportamento non è cambiato in Java 7; la guida allo studio è formulata solo male.


2
Quindi la risposta è "Non c'è differenza da Java 7 e precedenti, per quanto riguarda l'operatore ternario", giusto?
Mathias Bader

5
Sembra giusto. Ho scritto un promemoria agli autori - in attesa della loro risposta
Mathias Bader il

Probabilmente potresti anche trovare un URL che confronta il codice dell'operatore tra le versioni. Se sei paranoico / curioso.
Steve Clay

7
Il numero di domande scritte male (o semplicemente sbagliate) in queste certificazioni Oracle è sempre sorprendente ...
Voo
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.