webentwicklung-frage-antwort-db.com.de

Ternärer Operator in Java nur einen Ausdruck auswerten seit Java 7 - war das anders in Java 1.6 und niedriger?

Bei der Vorbereitung auf die Prüfung zum Oracle Certified Associate Java SE 8 Programmer 1) bin ich auf den folgenden Absatz zum ternären Ausdruck im offiziellen Study Guide gestoßen:

Bewertung des ternären Ausdrucks
Ab Java 7) wird nur einer der Ausdrücke der rechten Hand des ternären Operators zur Laufzeit ausgewertet, ähnlich wie die Kurzschlussoperatoren, falls vorhanden Wenn einer der beiden Ausdrücke auf der rechten Seite in einem ternären Operator einen Nebeneffekt auslöst, wird er möglicherweise zur Laufzeit nicht angewendet. [...]

Es wird angegeben, dass nur einer der beiden Ausdrücke ausgewertet wird. Dies wird anhand des folgenden Beispiels veranschaulicht:

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

Hier wird nur y inkrementiert, z jedoch nicht wie erwartet.

Worüber ich stolpere, ist der Anfang des Absatzes (gelb markiert), in dem steht: "Ab Java= 7, ...". Ich habe denselben Code mit Java 1.6 und ich kann keinen Unterschied im Verhalten feststellen. Ich habe erwartet, dass Java 1.6 beide Ausdrücke nur anhand der im Absatz angegebenen Informationen auswertet. Hat jemand eine Idee, was wollten sie mit "Ab Java 7, ..." sagen?

Edit: Um Verwirrung zu vermeiden: Es läuft auf die Frage hinaus, seitdem sie 'As of Java 7' schreiben, gab es irgendetwas, das sich bezüglich des ternären Operators geändert hat, als Wechsel von Java 6 zu Java 7?

104
Mathias Bader

Ich bin einer der Autoren des Buches, aus dem das stammt. Obwohl ich diesen speziellen Satz nicht geschrieben habe, bin ich damit einverstanden, dass die Absicht lautete, dass dies auf Java 7) getestet wurde.

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

86
Jeanne Boyarsky

Aus dem Java 6 JLS :

Zur Laufzeit wird der erste Operandenausdruck des bedingten Ausdrucks zuerst ausgewertet. Falls erforderlich, wird eine Unboxing-Konvertierung für das Ergebnis durchgeführt. Der resultierende boolesche Wert wird dann verwendet, um entweder den zweiten oder den dritten Operandenausdruck zu wählen:

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

Der ausgewählte Operandenausdruck wird dann ausgewertet und der resultierende Wert wird in den Typ des bedingten Ausdrucks konvertiert, der durch die oben angegebenen Regeln bestimmt wird. Diese Konvertierung kann eine Boxing-Konvertierung (§5.1.7) oder eine Unboxing-Konvertierung umfassen. Der nicht ausgewählte Operandenausdruck wird für diese bestimmte Auswertung des bedingten Ausdrucks nicht ausgewertet.

Eine ähnliche Formulierung findet sich auch in den JLS-Ausgaben, die auf 1. zurückgehen. Das Verhalten änderte sich nicht in Java 7; der Studienführer ist nur schlecht formuliert.

114
user2357112