Тип умовного використання, що використовується в циклі, може обмежувати види оптимізацій, які може виконувати компілятор, на краще або на гірше. Наприклад, наведено:
uint16_t n = ...;
for (uint16_t i=1; i<=n; i++)
... [loop doesn't modify i]
компілятор може припустити, що вищевказана умова повинна змусити цикл вийти після циклу n- го проходу, якщо n не може 65535 і цикл може вийти якимось чином, окрім як i, що перевищує n. Якщо ці умови застосовуються, компілятор повинен генерувати код, який би спричинив запуск циклу, поки щось, крім вищевказаної умови, не призведе до його виходу.
Якщо цикл замість цього був записаний як:
uint16_t n = ...;
for (uint16_t ctr=0; ctr<n; ctr++)
{
uint16_t i = ctr+1;
... [loop doesn't modify ctr]
}
тоді компілятор міг би припустити, що цикл ніколи не потребуватиме виконання більше n разів, і, таким чином, він зможе генерувати більш ефективний код.
Зауважте, що будь-яке переповнення підписаними типами може мати неприємні наслідки. Подано:
int total=0;
int start,lim,mult; // Initialize values somehow...
for (int i=start; i<=lim; i++)
total+=i*mult;
Компілятор може переписати це як:
int total=0;
int start,lim,mult; // Initialize values somehow...
int loop_top = lim*mult;
for (int i=start; i<=loop_top; i+=mult)
total+=i;
Такий цикл поводитиметься однаково з оригіналом, якщо в обчисленнях не виникає переповнення, але міг би працювати назавжди навіть на апаратних платформах, де цілочисельне переповнення зазвичай має послідовну семантику обгортання.