Loại điều kiện được sử dụng trong một vòng lặp có thể giới hạn các loại tối ưu hóa mà trình biên dịch có thể thực hiện, tốt hơn hoặc xấu hơn. Ví dụ: đã cho:
uint16_t n = ...;
for (uint16_t i=1; i<=n; i++)
... [loop doesn't modify i]
một trình biên dịch có thể giả định rằng điều kiện trên sẽ khiến vòng lặp thoát ra sau vòng lặp thứ n trừ khi n có thể 65535 và vòng lặp có thể thoát theo một số cách khác ngoài i vượt quá n. Nếu những điều kiện đó được áp dụng, trình biên dịch phải tạo mã sẽ khiến vòng lặp chạy cho đến khi một cái gì đó không phải là điều kiện trên khiến nó thoát ra.
Nếu vòng lặp thay vào đó được viết là:
uint16_t n = ...;
for (uint16_t ctr=0; ctr<n; ctr++)
{
uint16_t i = ctr+1;
... [loop doesn't modify ctr]
}
sau đó một trình biên dịch có thể giả định một cách an toàn rằng vòng lặp sẽ không bao giờ cần phải thực thi nhiều hơn n lần và do đó có thể tạo mã hiệu quả hơn.
Lưu ý rằng bất kỳ tràn với các loại đã ký có thể có hậu quả khó chịu. Được:
int total=0;
int start,lim,mult; // Initialize values somehow...
for (int i=start; i<=lim; i++)
total+=i*mult;
Một trình biên dịch có thể viết lại như sau:
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;
Một vòng lặp như vậy sẽ hoạt động giống hệt với bản gốc nếu không xảy ra tràn trong tính toán, nhưng có thể chạy mãi mãi ngay cả trên các nền tảng phần cứng nơi tràn số nguyên thường có ngữ nghĩa gói nhất quán.