这些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
. 它可能会在远离导致错误的循环的地方失败,从而难以追溯。或者它可以默默地继续做一些意想不到的事情,这更糟糕。
您更喜欢哪种终止条件,为什么?还有其他考虑吗?为什么许多知道这一点的程序员拒绝应用它?