Я предполагаю, что онлайн-компиляторы используют GCC или совместимый компилятор. Конечно, любой другой компилятор также может выполнять такую же оптимизацию, но документация GCC хорошо объясняет, что он делает:
-faggressive-loop-optimizations
Этот параметр указывает оптимизатору цикла использовать языковые ограничения для получения границ количества итераций цикла. Это предполагает, что код цикла не вызывает неопределенное поведение, например, вызывая переполнение целого числа со знаком или доступ к массиву за пределами диапазона. Границы количества итераций цикла используются для управления развертыванием и отслаиванием цикла, а также оптимизацией теста выхода из цикла. Эта опция включена по умолчанию.
Эта опция просто позволяет делать предположения на основе случаев, когда UB доказано. Чтобы воспользоваться этими предположениями, может потребоваться включить другие оптимизации, например сворачивание констант.
Знаковое целочисленное переполнение имеет неопределенное поведение. Оптимизатор смог доказать, что любое значение i
больше 173 вызовет UB, и, поскольку он может предположить, что UB нет, он также может предположить, что i
оно никогда не будет больше 173. Затем он может дополнительно доказать, что i < 300
это всегда верно, и так что условие цикла можно оптимизировать.
Почему 4169, а не какое-то другое значение?
Эти сайты, вероятно, ограничивают количество выводимых строк (или символов, или байтов), которые они показывают, и имеют такое же ограничение.