环路终止条件

pal*_*m3D 5 language-agnostic conditional correctness for-loop

这些for循环是算法形式正确性证明的第一个基本例子.它们具有不同但等效的终止条件:

1   for ( int i = 0; i != N; ++i )

2   for ( int i = 0; i < N; ++i )
Run Code Online (Sandbox Code Playgroud)

后置条件中的区别变得明显:

  • 第一个给出i == N了循环终止后的有力保证.

  • 第二个只给出了i >= N在循环终止后的弱保证,但你会想到这一点i == N.

如果由于任何原因将增量++i更改为类似的内容i += 2,或者如果i在循环内部进行了修改,或者如果N是负数,则程序可能会失败:

  • 第一个可能陷入无限循环.它在出现错误的循环中提前失败.调试很简单.

  • 第二个循环将终止,并且稍后由于您的错误假设,程序可能会失败i == N.它可能会远离导致错误的循环失败,从而难以追溯.或者它可以默默地继续做一些意想不到的事情,这更糟糕.

您更喜欢哪种终止条件,为什么?还有其他考虑因素吗?为什么许多知道这一点的程序员拒绝应用它?

Chr*_*ung 1

在 C++ 中,!=出于通用性考虑,首选使用测试。C++ 中的迭代器有多种概念,例如输入迭代器正向迭代器双向迭代器随机访问迭代器,每一个概念都通过新功能扩展了前一个迭代器。为了<工作,需要随机访问迭代器,而!=只需要输入迭代器。