Java >> Tutoriel Java >  >> Java

Le comportement de `i =i++` en Java

Il y a peu de temps, je dirigeais un laboratoire Java et un de mes étudiants m'avait demandé pourquoi son code ne fonctionnait pas. En parcourant leur solution, j'ai remarqué une ligne particulière qui disait :i =i++ . Jusque-là, je n'avais jamais vu de code comme celui-ci, et je ne l'avais certainement jamais essayé. J'ai donc fait ce que tout bon enseignant aurait fait et j'ai consulté Google pour en savoir plus.

Boucles Java

En tant que personne qui a écrit un peu de matériel d'apprentissage Java, je me considère au moins compétent dans la langue. Cependant, au fur et à mesure que je continue d'enseigner, je constate que les étudiants trouvent toujours des moyens créatifs d'étirer la langue.

Lors de ma récente tentative d'enseignement des boucles, je suis tombé sur une solution étudiante qui avait la syntaxe de boucle while suivante :

int i = 0;
while (i < 10) {
  i = i++;
}

Peut-être que ce bout de code étrange était de ma faute. Après tout, je dis souvent à mes élèves qu'il existe de nombreuses façons de résoudre un problème.

Pour aider à ce message, j'aime changer ma syntaxe de temps en temps. Par exemple, il n'est pas rare que je partage des solutions aux problèmes de boucle en utilisant une syntaxe de boucle différente à chaque fois. Parfois, j'utiliserai une boucle for tandis que d'autres fois j'utiliserai une boucle while. Si je me sens bien, je pourrais même montrer un pour chaque boucle. De temps en temps, je vais même lancer une récursivité pour faire bouger les choses, mais vous ne me rattraperez jamais en utilisant une boucle do while.

En tout cas, cette mentalité apparaît lorsque j'incrémente également des variables. Par exemple, j'ai tendance à enseigner i = i + 1 d'abord parce que cela fait trébucher les étudiants qui n'ont pas reconnu que le signe égal est vraiment l'opérateur d'affectation. Bien sûr, une fois que je pense qu'ils ont saisi le concept, j'ai généralement recours à des raccourcis comme i++ et i += 1 .

Malheureusement, ma poussée d'expression personnelle peut parfois entraîner une syntaxe mutilée comme :

int i = 0;
while (i < 10) {
  // Do something
  i++;
} else {
  // Do something else
}

Chaque fois que je vois quelque chose comme ça, j'ai l'impression de faire un pas de plus pour surmonter la malédiction de la connaissance. Saisissez :i =i++ .

Opérateurs d'incrémentation Java

Comme je l'ai déjà mentionné, il existe de nombreuses façons d'incrémenter une variable en Java. La liste suivante couvre un certain nombre d'exemples, bien que certains soient idiots :

i = i + 1;
i += 1;
i++;
++i;
i = i - -1;
i -= -1;
i = -(~i)

Malgré toutes les options ci-dessus, je n'avais jamais pensé à essayer i =i++ , pourtant cela a beaucoup de sens. Après tout, il semble que nous incrémentons la variable et stockons le résultat. Pour être honnête, j'étais un peu perplexe quand je l'ai vu en direct dans le labo.

Il s'avère que i =i++ ne fonctionne pas comme prévu, et cela a à voir avec la façon dont le côté droit de l'instruction d'affectation est évalué. Depuis i++ est un opérateur postfixé, i est incrémenté mais son ancienne valeur est renvoyée. En conséquence, i s'écrase avec l'ancienne valeur.

Si l'explication ci-dessus n'est pas bonne, essayez de jeter un œil à l'extrait de code suivant qui reproduit le comportement :

int temp = i;
i++;
i = temp;

Si nous utilisions le i = i++ syntaxe dans une boucle, nous aurions une boucle infinie entre nos mains avec peu à notre disposition pour diagnostiquer le bogue. Heureusement, j'étais là pour au moins reconnaître le problème. Que j'aie compris ou non le bogue était un problème distinct, mais je suis sûr que j'ai fait gagner beaucoup de temps à cet étudiant. Maintenant, j'espère partager mes découvertes avec d'autres !

Le retour à la maison

À ce stade de la série, je commence à remarquer une tendance :

  1. Un étudiant écrit un code intéressant
  2. Cela ne fonctionne pas à ma grande surprise
  3. Je passe du temps perplexe
  4. J'écris un article pour discuter de mes découvertes

Qu'il s'agisse de se battre avec l'API Scanner ou de découvrir de nouvelles façons de jouer à Rock Paper Scissors, je dois dire que je m'amuse beaucoup à apprendre de mes élèves. J'ai absolument hâte de devenir professeur.

En attendant, je continuerai à documenter tout le plaisir que j'ai en enseignant. Si vous appréciez mon travail, pensez à vous abonner. Si vous êtes déjà abonné, vous pouvez aider à faire passer le message en partageant cet article avec des personnes que vous connaissez.

En tout cas, merci encore d'avoir pris le temps de soutenir mon travail.


Balise Java