这些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