web-dev-qa-db-fra.com

Opérateur ternaire en Java n'évaluant qu'une seule expression depuis Java 7 - était-ce différent dans Java 1.6 et inférieur?)

En préparant pour Oracle Certified Associate Java SE 8 Programmer 1 examen, je suis tombé sur le paragraphe suivant sur l'expression ternaire dans le Guide d'étude officiel:

Évaluation de l'expression ternaire
À partir de Java 7, une seule des expressions de droite de l'opérateur ternaire sera évaluée au moment de l'exécution. D'une manière similaire aux opérateurs de court-circuit, si un des deux expressions de droite dans un opérateur ternaire produit un effet secondaire, il peut ne pas être appliqué au moment de l'exécution. Illustrons ce principe avec l'exemple suivant: [...]

Il indique que seule une des deux expressions est évaluée, démontrant avec l'exemple suivant:

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

Ici, seulement y incrémente, mais pas z, comme vous vous en doutez.

Ce que je rencontre, c'est le début du paragraphe (marqué en jaune) où il est écrit "À partir de Java 7, ...". J'ai testé le même code avec Java 1.6 et je ne trouve aucune différence dans le comportement. Je m'attendais à Java 1.6 à évaluer les deux expressions uniquement à partir des informations fournies dans le paragraphe. Quelqu'un at-il une idée de ce que ils voulaient dire avec "A partir de Java 7, ..."?

Edit: Pour éviter toute confusion: Cela se résume à la question, Puisqu'ils écrivent 'A partir de Java 7', y a-t-il eu quelque chose qui a changé concernant l'opérateur ternaire, quand passage de Java 6 à Java 7?

104
Mathias Bader

Je suis l'un des auteurs du livre dont il est issu. Bien que je n'aie pas écrit cette phrase particulière, je conviens que l'intention était "ceci a été testé sur Java 7". Je ferai une note pour le supprimer si nous écrivons une autre édition.

Pour être clair, l'opérateur ternaire s'est comporté de la même manière en Java 8, 7, 6, etc. Et je serais assez surpris s'il change à l'avenir.

86
Jeanne Boyarsky

Depuis Java 6 JLS :

Au moment de l'exécution, la première expression d'opérande de l'expression conditionnelle est évaluée en premier; si nécessaire, une conversion de déballage est effectuée sur le résultat; la valeur booléenne résultante est ensuite utilisée pour choisir la deuxième ou la troisième expression d'opérande:

  • Si la valeur du premier opérande est vraie, alors la deuxième expression d'opérande est choisie.
  • Si la valeur du premier opérande est fausse, alors la troisième expression d'opérande est choisie.

L'expression d'opérande choisie est ensuite évaluée et la valeur résultante est convertie en le type de l'expression conditionnelle tel que déterminé par les règles énoncées ci-dessus. Cette conversion peut inclure la conversion de boxe (§5.1.7) ou de déballage. L'expression d'opérande non choisie n'est pas évaluée pour cette évaluation particulière de l'expression conditionnelle.

Une formulation similaire apparaît également dans les éditions JLS depuis 1. . Le comportement n'a pas changé en Java 7; le guide d'étude est juste mal formulé.

114
user2357112