這些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
的錯誤假設,程序可能會稍後失敗。它可能會遠離導致錯誤的循環,使其很難追溯。或者它可以默默繼續做出意想不到的事情,這更糟糕。
你更喜歡哪種終止條件,爲什麼?還有其他的考慮嗎?爲什麼許多知道這個的程序員拒絕應用它?
對於那些提到我不在for之外的人,有必要指出,在推理程序時我可以使用終止時的i值。例如,如果你想用一個保持不變P(i)的循環來建立P(N),那麼i == N給你P(N),而當i> = N時不會。 – mweerden 2008-09-25 13:03:30
+1表達良好的問題,清楚地表達每個選項的優點。 – 2010-10-06 08:23:29