Bonjour,
Que fait une telle boucle :
Merci d'avance.
Code : Sélectionner tout - Visualiser dans une fenêtre à part for (k++, l = n -1; k < l; k++, l--) {}
Bonjour,
Que fait une telle boucle :
Merci d'avance.
Code : Sélectionner tout - Visualiser dans une fenêtre à part for (k++, l = n -1; k < l; k++, l--) {}
Elle incrémente k jusqu'à une borne supérieure l, qui elle même est décrémentée à chaque itération.
En général, dans une boucle, la condition d'arrêt est fixe. Un peu comme si à chaque itération, tu avançais vers un mur qui ne bouge pas. Là, tu avances vers un véhicule arrivant en sens inverse...
Les conditions initiales en elles-mêmes sortent également de l'ordinaire, bien qu'il n'y ait pas vraiment de complexité.
Salut,
En fait, une boucle for se lit sous la forme de for (valeur(s) de départ ; condition(s) d'arrêt ; évolutions des valeurs)
Tu as donc
Ce genre de boucle n'est clairement pas destiné à se retrouver "toute seule" car elle n'aurait sans doute qu'un intérêt bien piètre dans ce cas (il y a de fortes chances pour qu'elle se trouve imbriquée dans une autre boucle )
- deux valeurs de départ:
- k dont la valeur équivaut à k
- n dont la valeur équivaut à n-1
- une condition d'arrêt
- lorsque k n'est pas plus petit (donc qu'il est égal ou plus grand) que l
- deux évolutions de valeur :
- k est incrémenté
- l est décrémenté
En effet, la première instruction k++ aura un effet assez particulier dans le sens où si k vaut 2 à l'origine, la valeurs prise en compte pour la boucle sera 2, mais que la valeur de k vaudra... 3 et que la deuxième instruction k++ aura pour résultat d'incrémenter encore la valeur de k.
De la même manière, l vaudra systématiquement (lorsque tu rentre pour la première fois dans la boucle) n-1 et sera systématiquement décrémenté avant de retourner dans la boucle.
L'évolution des valeur ressemblerait donc à quelque chose comme (pour n == 10 et k == 1 à la base)
(soit 4 itérations)
- k =1, l=9
- k=2, l=8
- k=3, l=7
- k=4, l=6
- STOP (k=5 n'est pas plus petit que l=5 )
Au final, lorsque tu ne rentreras plus dans la boucle, k (qui valait 2 avant la boucle) ne vaudra plus 2 mais 2+1 (première incrémentation) + (nombre de fois qu'on est passé dans la boucle).
Mais il faut savoir que, si tu venais à écrire une telle boucle dans mon équipe, tu passerais par la fenêtre avant même d'avoir pu dire "ouf", à cause des effets de bord qu'elle produira et que celui qui a pondu un tel code mérite une bonne séance de
A méditer: La solution la plus simple est toujours la moins compliquée
Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
Compiler Gcc sous windows avec MinGW
Coder efficacement en C++ : dans les bacs le 17 février 2014
mon tout nouveau blog
Merci pour cette réponse très détaillée.
Pourquoi cela n'incrémentait pas deux fois k?
O a bien k++ en début de boucke et k++en fin de boucle.
for(k++; k<42; ++k); est équivalent àIl n'y a pas de différences ici de pré / post incrémentation.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 k++; while(k<42) { ++k; }
On à donc k==6 et l==5 après 4 itérations.
@xavierdestev, k est incrémenté une fois "avant" la boucle, et une fois à chaque itération.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager