2015-04-10 11 views
103

Vorbereitung auf die Oracle Certified Associate Java SE 8 Programmer 1 Prüfung, stieß ich auf den folgenden Absatz über dem ternären Ausdruck in der offiziellen Study Guide:Ternärer Operator in Java, der nur einen Ausdruck seit Java 7 auswertet - war das in Java 1.6 und niedriger anders?

Ternary Expression Evaluation
Ab Java 7, Nur einer der rechten Ausdrücke des ternären Operators wird zur Laufzeit ausgewertet. Ähnlich wie bei den Kurzschlussoperatoren kann, wenn einer der beiden rechten Ausdrücke in einem ternären Operator einen Nebeneffekt ausführt, dieser zur Laufzeit nicht angewendet werden. Lassen Sie uns dieses Prinzip mit dem folgenden Beispiel veranschaulichen: [...]

Er sagt, dass nur einer der beiden Ausdrücke ausgewertet, mit dem folgenden Beispiel demonstriert:

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

hier nur y Schritten , aber z nicht, wie Sie es erwarten würden.

Worüber ich stolpere ist der Anfang des Absatzes (gelb markiert), wo steht "Ab Java 7, ...". Ich habe den gleichen Code mit Java 1.6 getestet und finde keinen Unterschied im Verhalten. Ich erwartete, dass Java 1.6 beide Ausdrücke nur anhand der Informationen aus dem Absatz bewertet. Hat jemand eine Idee was sie mit "Ab Java 7, ..." sagen wollten?

Bearbeiten: Um Verwechslungen zu vermeiden: Es läuft auf die Frage hinaus, seit sie 'ab Java 7' schreiben, gab es irgendwas, was den ternären Operator änderte, wenn von Java 6 zu Java 7 gewechselt wurde?

+4

Warum sollten Sie erwarten, dass z auch erhöht wird? Das ergibt für mich keinen Sinn. –

+0

was ist das Problem, sie sagten, nur 1 Ausdruck wird ausgewertet, y ++ 'oder' z ++ 'abhängig von der Bedingung – silentprogrammer

+15

klingt wie ein schlecht geschriebenes Buch, ternäre Betreiber haben sich seit dem Einschalten von Java nicht verändert, afaik – NimChimpsky

Antwort

82

Ich bin einer der Autoren des Buches, aus dem es stammt.Obwohl ich diesen bestimmten Satz nicht geschrieben habe, stimme ich zu, dass die Absicht war "das wurde auf Java 7 getestet". Ich werde eine Notiz machen, um das zu entfernen, wenn wir eine weitere Ausgabe schreiben.

Um es klar zu sagen, hat sich der ternäre Operator in Java 8, 7, 6, usw. genauso verhalten. Und ich wäre ziemlich überrascht, wenn sich das in Zukunft ändern würde.

111

Von der Java 6 JLS:

Zur Laufzeit der erste Operand Ausdruck des bedingten Ausdruck ausgewertet zuerst; falls erforderlich, wird die Unboxing-Konvertierung für das Ergebnis ausgeführt. die ich ergebende Boolesche Wert wird dann zu wählt entweder den zweiten oder den dritten Operanden Ausdruck verwendet:

  • Wenn der Wert des ersten Operanden wahr ist, dann der zweite Operand Ausdruck gewählt wird.
  • Wenn der Wert des ersten Operanden falsch ist, wird der dritte Operandenausdruck ausgewählt.

Die gewählte Operand Ausdruck wird dann ausgewertet, und die resultierende Wert auf den Typ des Bedingungsausdrucks als durch die Regeln bestimmt oben angegebenen umgesetzt wird. Diese Konvertierung kann Boxen (§5.1.7) oder Unboxing-Konvertierung enthalten. Der ausgewählte Operandenausdruck wird nicht für diese bestimmte Auswertung des bedingten Ausdrucks ausgewertet.

Eine ähnliche Formulierung erscheint auch in JLS-Ausgaben, die auf 1.0 zurückgehen. Das Verhalten hat sich in Java 7 nicht geändert. Der Studienführer ist nur schlecht formuliert.

+1

Also die Antwort ist "Es gibt keinen Unterschied ab Java 7 und vorher, bezüglich des ternären Betreibers", richtig? –

+1

@ mader: Ja. Es hat immer so funktioniert. – user2357112

+5

Scheint echt. Ich schrieb ein Memo an die Autoren - freue mich auf ihre Antwort –