Я пам'ятаю з моїх днів, коли ми проводили 8086 асамблею в коледжі, це було більш вдало:
for (int i = 6; i > -1; i--)
як була операція JNS, яка означає Перейти, якщо немає знаку. Використання цього означало, що не було пошуку пам'яті після кожного циклу, щоб отримати значення порівняння, а також порівняти. У наші дні більшість компіляторів оптимізують використання реєстру, так що річ пам'яті вже не важлива, але ви все одно отримаєте непотрібне порівняння.
До речі, вводячи 7 або 6 у цикл, ви вводите " магічне число ". Для кращої читабельності ви повинні використовувати константу з ім'ям наміру виявлення. Подобається це:
const int NUMBER_OF_CARS = 7;
for (int i = 0; i < NUMBER_OF_CARS; i++)
EDIT: Люди не отримують монтажу, тому очевидно потрібний більш повний приклад:
Якщо ми робимо для (i = 0; i <= 10; i ++), потрібно зробити це:
mov esi, 0
loopStartLabel:
; Do some stuff
inc esi
; Note cmp command on next line
cmp esi, 10
jle exitLoopLabel
jmp loopStartLabel
exitLoopLabel:
Якщо ми зробимо для (int i = 10; i> -1; i--), ви можете піти з цього:
mov esi, 10
loopStartLabel:
; Do some stuff
dec esi
; Note no cmp command on next line
jns exitLoopLabel
jmp loopStartLabel
exitLoopLabel:
Я щойно перевірив, і компілятор Microsoft C ++ не робить цієї оптимізації, але це робиться, якщо ви робите:
for (int i = 10; i >= 0; i--)
Тож мораль полягає в тому, що якщо ви використовуєте Microsoft C ++ †, і зростаючий чи спадаючий значення не має ніякого значення, щоб отримати швидкий цикл, який слід використовувати:
for (int i = 10; i >= 0; i--)
а не будь-яке з цих:
for (int i = 10; i > -1; i--)
for (int i = 0; i <= 10; i++)
Але відверто отримати читабельність "for (int i = 0; i <= 10; i ++)", як правило, набагато важливіше, ніж відсутність однієї команди процесора.
† Інші компілятори можуть робити різні речі.