Эти for
-циклы являются одними из первых основных примеров формальных корректных доказательств алгоритмов. Они имеют разные, но эквивалентные условия расторжения:
1 for ( int i = 0; i != N; ++i )
2 for ( int i = 0; i < N; ++i )
Разница становится понятной в постусловиях:
Первый дает сильную гарантию, что i == N
после завершения цикла.
Второй дает слабую гарантию того, что i >= N
после завершения цикла, но у вас возникнет соблазн предположить, что i == N
.
Если по какой-либо причине приращение ++i
когда-либо изменяется на что-то вроде i += 2
, или если i
изменяется внутри цикла, или если N
отрицательно, программа может завершиться ошибкой:
Первый может застрять в бесконечном цикле. Сбой рано, в цикле с ошибкой. Отладка проста.
Второй цикл завершится, и через некоторое время программа может завершиться с ошибкой из-за вашего неверного предположения i == N
. Он может потерпеть неудачу вдали от цикла, вызвавшего ошибку, что затрудняет его отслеживание. Или он может молча продолжать делать что-то неожиданное, что еще хуже.
Какое условие прекращения вы предпочитаете и почему? Есть ли другие соображения? Почему многие программисты, которые знают это, отказываются применять это?