7
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”中的示例。只是想知道为什么作者更喜欢第一个

4

12 回答 12

14

第二。有两个原因

  1. 小于(或有时 <=)是大多数编码人员编写这些的常用方式,如果可能的话,最好遵守约定 - != 可能会让大多数编码人员查看两次以检查循环中是否有奇怪的东西,而<将立即被理解。

  2. != 取决于确切的条件。如果在维护期间修改了循环的内部并且我不小心在循环内增加了,那么你最终会得到一个无限循环。一般来说,让你的终止条件尽可能宽总是更好的——它只是更健壮。

2当然是1的原因。

于 2009-01-25T10:22:25.333 回答
3

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

于 2009-01-25T10:18:54.047 回答
3

使用condition <要好得多,因为它减少了越过标记值并陷入无限循环的可能性。

于 2009-01-25T10:23:01.450 回答
2

如问题中所述,两个循环是等效的。然而,在实际代码中,事情通常会更复杂一些,在这种情况下,“i < n”条件往往更安全一些。例如,如果 i 可能增加不止一,它可能会超过 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);
}

(或者,更好的是,使用支持语法的语言来指定前置和后置条件以及原生循环不变量。)

如果您想思考这类问题,您可能会对Andrew Koenig 的“C Traps and Pitfalls”一书(参见http://en.wikipedia.org/wiki/C_Traps_and_Pitfalls入门)感兴趣。

于 2009-01-25T10:25:40.117 回答
1

<n是最常用的(我的看法)

于 2009-01-25T10:16:41.197 回答
1

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

于 2009-01-25T10:23:15.037 回答
1

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

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

于 2009-01-25T10:24:10.183 回答
1

我更喜欢使用 < ,因为只需查看代码,您就可以知道它是一个递增的循环,它支持您使用 i++ 的事实。

如果您使用 i++ 和 < 并且由于某种原因(其他编码器、拼写错误、人为错误),您的代码会将增量更改为 i——您会立即知道循环没有被评估,就像 != 它会工作无论哪种方式都使调试变得不那么简单。

于 2009-01-25T10:55:40.947 回答
0

我看不出这很重要,难道没有更重要的事情要担心吗?

我总是使用后者,这是我见过的最多的。

有人肯定会因为它而将我击落....

于 2009-01-25T10:16:45.457 回答
0

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

于 2009-01-25T10:35:08.053 回答
0

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

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

原因是与 0 比较更快。

于 2009-01-25T10:38:09.953 回答
0

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

循环,只要 i 小于n

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

我会避免选择选项<,因为您可能会不小心“跨过”最终值。我认为这个论点是有缺陷的。因为如果您确实不小心踩到了,那么这是一个错误,应该尽快注意到(Fail-fast)。

于 2009-01-25T17:34:04.660 回答