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。“只是 想知道作者为何更喜欢 第一个
答案 0 :(得分:14)
第二个。有两个原因
小于(或有时&lt; =)是大多数编码员写这些的常用方法,如果可能的话,最好坚持惯例 - !=可能会让大多数编码员看起来两次检查是否有循环中有奇怪的东西,而&lt;将立即被理解。
!=取决于确切的条件。如果循环内部在维护期间被修改并且我意外地在循环内增加,那么最终会出现无限循环。通常情况下,最好使终止条件尽可能宽 - 它更加健壮。
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)。