【发布时间】:2010-09-13 00:40:44
【问题描述】:
这些for-loops 是算法形式正确性证明的第一个基本示例。它们具有不同但等效的终止条件:
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的错误假设,稍后程序可能会失败。它可能会在远离导致错误的循环的地方失败,从而难以追溯。或者它可以默默地继续做一些意想不到的事情,这更糟糕。
您更喜欢哪种终止条件,为什么?还有其他考虑吗?为什么很多知道这个的程序员都拒绝应用?
【问题讨论】:
-
对于那些提到 i 在 for 之外不可用的人,请注意,在推理程序时可以使用终止时的 i 值。例如,如果你想用一个保持不变 P(i) 的循环来建立 P(N),那么 i==N 会给你 P(N) 而 i>=N 不会。
-
+1 表示写得很好的问题,清楚地表达了每个选项的优点。
标签: language-agnostic for-loop conditional correctness