循环中哪个是首选条件?

时间:2009-01-25 10:14:27

标签: conditional-statements loops

int n = 5;
for(int i = 0;i!=n;i++)//condition !=
{
//executing 5times
}

int n = 5;
for(int i = 0;i<n;i++)//condition <
{
//executing 5times

}

哪一个更受欢迎?

  

这是“Accelerated C ++”的例子   :实例编程示例/   Andrew Koenig,Barbara E. Moo。“只是   想知道作者为何更喜欢   第一个

12 个答案:

答案 0 :(得分:14)

第二个。有两个原因

  1. 小于(或有时&lt; =)是大多数编码员写这些的常用方法,如果可能的话,最好坚持惯例 - !=可能会让大多数编码员看起来两次检查是否有循环中有奇怪的东西,而&lt;将立即被理解。

  2. !=取决于确切的条件。如果循环内部在维护期间被修改并且我意外地在循环内增加,那么最终会出现无限循环。通常情况下,最好使终止条件尽可能宽 - 它更加健壮。

  3. 2当然是1的原因。

答案 1 :(得分:3)

我会说<因为它捕获了更广泛的条件。假设n不是常数,而是从函数返回,该函数在极少数情况下返回-1。在那种情况下,你有一个更长的循环(直到int包装到-ve值!)和循环的!=版本。

答案 2 :(得分:3)

使用condition <要好得多,因为它可以降低踩踏哨兵值并陷入无限循环的可能性。

答案 3 :(得分:2)

如问题所示,两个循环都是等价的。然而,在实际代码中,通常情况稍微复杂一些,并且在这种情况下,“i&lt; n”条件往往更安全一点。例如,如果我可能增加一个以上,它可能会超过n然后“i!= n”版本将导致一个永恒的循环。

这是一个防御性编程案例。它并没有被普遍接受:有些人更愿意确保事情尽可能地失败,以便早期发现错误。防守风格可能隐藏这样的小问题。但是,如果你想捕获所有错误,你可能会一路走下去:

int n = 5;
int i = 0;
while (i != n) {
    int old_i = i;
    // the real stuff of the loop here
   ++i;
   assert(i == old_i + 1);
}

(或者,更好的是,使用支持synxtax的语言来指定前后条件和本地循环不变量。)

Andrew Koenig撰写的“C陷阱和陷阱”一书(见http://en.wikipedia.org/wiki/C_Traps_and_Pitfalls 对于初学者来说,如果你想思考这类问题,你可能会感兴趣。

答案 4 :(得分:1)

<n是最常用的(我的意见)

答案 5 :(得分:1)

我通常使用&lt;第二种方式。 但是考虑使用!=因为c ++中的stl迭代器以这种方式工作。

答案 6 :(得分:1)

第二个。它总是在某个时刻完成(假设你没有做任何有趣的事情,比如在循环中玩计数器的值)。

我从来没有见过第一次使用,至少,不是那样。

答案 7 :(得分:1)

我更喜欢使用&lt;因为通过查看代码,你可以告诉它一个不断增加的循环,它支持你使用i ++的事实。

如果您使用的是i ++和&lt;由于某种原因(其他编码器,拼写错误,人为错误),你的代码会将增量更改为i--你会立即知道循环没有被评估,就像!=它会以任何方式使它变得不那么重要调试。

答案 8 :(得分:0)

我不明白这是否重要,是否有更重要的事情需要担心?

我总是使用后者,这就是我最常见的。

有人肯定会把我击倒在地上......

答案 9 :(得分:0)

“我&lt; n”更好。因为如果你使用“i!= n”并且在某些情况下你的初始i大于n,你将进入一个无限循环。

答案 10 :(得分:0)

我相信如果您正在优化,这是一个更好的选择 速度:

int n = 5;
for(int i = n;i > 0;i--)
{
//executing 5times
}

原因是与0比较更快。

答案 11 :(得分:0)

我说这取决于迭代器变量的类型。如果你知道它是一个整数,我会使用第二个,因为你可以说

  

循环,只要我小于而不是

对于包括我自己在内的大多数程序员来说,我认为这更容易阅读。如果您不知道迭代器变量的类型,则应尽可能地假设其功能。 operator<可能无法用于i:如果它是除随机访问迭代器之外的任何迭代器,则不保证operator<可用。在这种情况下,我会使用operator!=

我会避免选择<选项只是因为您可能会意外“跳过”最终值。我认为这个论点存在缺陷。因为如果你意外地跳过了,那么这是一个错误,应该尽快注意到它(Fail-fast)。

相关问题