Bonjour,
Que fait une telle boucle :
Merci d'avance.Code:for (k++, l = n -1; k < l; k++, l--) {}
Version imprimable
Bonjour,
Que fait une telle boucle :
Merci d'avance.Code: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 :sm: ;)
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:
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.
Merci beaucoup.