これらのfor
ループは、アルゴリズムの正式な正当性証明の最初の基本的な例の 1 つです。それらには、異なるが同等の終了条件があります。
1 for ( int i = 0; i != N; ++i )
2 for ( int i = 0; i < N; ++i )
違いは事後条件で明らかになります。
i == N
最初のものは、ループが終了した後の強力な保証を提供します。2番目のものは、ループが終了した後の弱い保証を与えるだけ
i >= N
ですが、それを仮定したくなるでしょうi == N
.
何らかの理由でインクリメント++i
が のようなものに変更されたi += 2
場合i
、またはループ内で変更された場合、またはN
が負の場合、プログラムは失敗する可能性があります。
最初のものは無限ループに陥る可能性があります。エラーのあるループの早い段階で失敗します。デバッグは簡単です。
2 番目のループは終了し、後で間違った仮定のためにプログラムが失敗する可能性があります
i == N
。バグの原因となったループから遠く離れた場所で失敗する可能性があり、追跡が困難になります。または、予想外のことを静かに続けてしまうこともあり、これはさらに悪いことです。
あなたはどの終了条件を好みますか、またその理由は何ですか? 他の考慮事項はありますか?これを知っている多くのプログラマーが、なぜそれを適用することを拒否するのでしょうか?