Je me souviens de mes jours où nous faisions 8086 Assembly à l'université, c'était plus performant à faire:
for (int i = 6; i > -1; i--)
car il y avait une opération JNS qui signifie Jump if No Sign. L'utilisation de cela signifiait qu'il n'y avait pas de recherche de mémoire après chaque cycle pour obtenir la valeur de comparaison et aucune comparaison non plus. De nos jours, la plupart des compilateurs optimisent l'utilisation des registres, de sorte que la mémoire n'est plus importante, mais vous obtenez toujours une comparaison inutile.
Au fait, mettre 7 ou 6 dans votre boucle introduit un " nombre magique ". Pour une meilleure lisibilité, vous devez utiliser une constante avec un nom révélateur d'intention. Comme ça:
const int NUMBER_OF_CARS = 7;
for (int i = 0; i < NUMBER_OF_CARS; i++)
EDIT: Les gens ne reçoivent pas l'assemblage, donc un exemple plus complet est évidemment nécessaire:
Si nous faisons pour (i = 0; i <= 10; i ++), vous devez faire ceci:
mov esi, 0
loopStartLabel:
; Do some stuff
inc esi
; Note cmp command on next line
cmp esi, 10
jle exitLoopLabel
jmp loopStartLabel
exitLoopLabel:
Si nous faisons pour (int i = 10; i> -1; i--) alors vous pouvez vous en tirer avec ceci:
mov esi, 10
loopStartLabel:
; Do some stuff
dec esi
; Note no cmp command on next line
jns exitLoopLabel
jmp loopStartLabel
exitLoopLabel:
Je viens de vérifier et le compilateur C ++ de Microsoft ne fait pas cette optimisation, mais il le fait si vous le faites:
for (int i = 10; i >= 0; i--)
Donc, la morale est que si vous utilisez Microsoft C ++ †, et que la montée ou la descente ne fait aucune différence, pour obtenir une boucle rapide, vous devez utiliser:
for (int i = 10; i >= 0; i--)
plutôt que l'un ou l'autre:
for (int i = 10; i > -1; i--)
for (int i = 0; i <= 10; i++)
Mais franchement, obtenir la lisibilité de "for (int i = 0; i <= 10; i ++)" est normalement beaucoup plus important que de manquer une commande de processeur.
† D'autres compilateurs peuvent faire des choses différentes.