Zakładam, że kompilatory online używają GCC lub kompatybilnego kompilatora. Oczywiście każdy inny kompilator może również przeprowadzić taką samą optymalizację, ale dokumentacja GCC dobrze wyjaśnia, co robi:
-faggressive-loop-optimizations
Ta opcja mówi optymalizatorowi pętli, aby używał ograniczeń językowych do określania granic dla liczby iteracji pętli. Zakłada się, że kod pętli nie wywołuje niezdefiniowanego zachowania, na przykład powodując przepełnienia liczb całkowitych ze znakiem lub dostęp do tablicy poza granicami. Granice liczby iteracji pętli służą do prowadzenia optymalizacji rozwijania i odrywania pętli oraz testów wyjścia z pętli. Opcja jest wyłączona domyślnie.
Ta opcja pozwala jedynie na przyjmowanie założeń na podstawie przypadków, w których udowodniono UB. Aby skorzystać z tych założeń, może być konieczne włączenie innych optymalizacji, takich jak ciągłe zwijanie.
Przepełnienie liczby całkowitej ze znakiem ma niezdefiniowane zachowanie. Optymalizator był w stanie udowodnić, że jakakolwiek wartość i
większa niż 173 spowodowałaby UB, a ponieważ może założyć, że nie ma UB, może również założyć, że i
nigdy nie jest większa niż 173. Następnie może dalej udowodnić, że i < 300
jest to zawsze prawda, i więc stan pętli można zoptymalizować.
Dlaczego 4169, a nie inna wartość?
Witryny te prawdopodobnie ograniczają liczbę wyświetlanych wierszy wyjściowych (lub znaków lub bajtów) i mają ten sam limit.