Ich gehe davon aus, dass die Online-Compiler GCC oder einen kompatiblen Compiler verwenden. Natürlich darf auch jeder andere Compiler die gleiche Optimierung durchführen, aber die GCC-Dokumentation erklärt gut, was er tut:
-faggressive-loop-optimizations
Diese Option weist den Schleifenoptimierer an, Sprachbeschränkungen zu verwenden, um Grenzen für die Anzahl der Iterationen einer Schleife abzuleiten. Dies setzt voraus, dass der Schleifencode kein undefiniertes Verhalten aufruft, indem er beispielsweise vorzeichenbehaftete Ganzzahlüberläufe oder nicht gebundene Array-Zugriffe verursacht. Die Grenzen für die Anzahl der Iterationen einer Schleife werden verwendet, um das Abrollen und Schälen der Schleife sowie die Optimierung des Schleifenausgangstests zu steuern. Diese Option ist standardmäßig aktiviert.
Diese Option ermöglicht lediglich Annahmen, die auf Fällen basieren, in denen UB nachgewiesen ist. Um diese Annahmen nutzen zu können, müssen möglicherweise andere Optimierungen aktiviert werden, z. B. die konstante Faltung.
Der vorzeichenbehaftete Ganzzahlüberlauf hat ein undefiniertes Verhalten. Der Optimierer konnte beweisen, dass ein Wert von i
mehr als 173 UB verursachen würde, und da er annehmen kann, dass es keine UB gibt, kann er auch annehmen, dass er i
niemals größer als 173 ist. Er kann dann weiter beweisen, dass dies i < 300
immer wahr ist, und so kann der Schleifenzustand weg optimiert werden.
Warum 4169 und kein anderer Wert?
Diese Sites begrenzen wahrscheinlich die Anzahl der Ausgabezeilen (oder Zeichen oder Bytes), die sie anzeigen, und teilen zufällig dieselbe Grenze.