Die Art der in einer Schleife verwendeten Bedingung kann die Art der Optimierungen einschränken, die ein Compiler zum Guten oder Schlechten ausführen kann. Zum Beispiel gegeben:
uint16_t n = ...;
for (uint16_t i=1; i<=n; i++)
... [loop doesn't modify i]
Ein Compiler könnte annehmen, dass die obige Bedingung dazu führen sollte, dass die Schleife nach der n-ten Durchgangsschleife beendet wird, es sei denn, n würde 65535 und die Schleife könnte auf eine andere Weise als um i, das n überschreitet, beendet werden. Wenn diese Bedingungen zutreffen, muss der Compiler Code generieren, der dazu führen würde, dass die Schleife ausgeführt wird, bis etwas anderes als die obige Bedingung dazu führt, dass sie beendet wird.
Wenn die Schleife stattdessen wie folgt geschrieben worden wäre:
uint16_t n = ...;
for (uint16_t ctr=0; ctr<n; ctr++)
{
uint16_t i = ctr+1;
... [loop doesn't modify ctr]
}
Dann könnte ein Compiler sicher davon ausgehen, dass die Schleife niemals mehr als n-mal ausgeführt werden muss und somit effizienteren Code generieren kann.
Beachten Sie, dass ein Überlauf mit signierten Typen unangenehme Folgen haben kann. Gegeben:
int total=0;
int start,lim,mult; // Initialize values somehow...
for (int i=start; i<=lim; i++)
total+=i*mult;
Ein Compiler könnte dies folgendermaßen umschreiben:
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;
Eine solche Schleife würde sich identisch zum Original verhalten, wenn in den Berechnungen kein Überlauf auftritt. Sie könnte jedoch auch auf Hardwareplattformen für immer ausgeführt werden, auf denen ein Ganzzahlüberlauf normalerweise eine konsistente Umbruchssemantik aufweist.