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”中的示例。只是想知道为什么作者更喜欢第一个
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”中的示例。只是想知道为什么作者更喜欢第一个
第二。有两个原因
小于(或有时 <=)是大多数编码人员编写这些的常用方式,如果可能的话,最好遵守约定 - != 可能会让大多数编码人员查看两次以检查循环中是否有奇怪的东西,而<将立即被理解。
!= 取决于确切的条件。如果在维护期间修改了循环的内部并且我不小心在循环内增加了,那么你最终会得到一个无限循环。一般来说,让你的终止条件尽可能宽总是更好的——它只是更健壮。
2当然是1的原因。
我会说<
因为它捕获了更广泛的条件。假设 n 不是常数,而是从一个在极少数情况下返回 -1 的函数返回的。在那种情况下,你会有一个更长的循环(直到 int 环绕到 -ve 值!)与循环的 != 版本。
使用condition <
要好得多,因为它减少了越过标记值并陷入无限循环的可能性。
如问题中所述,两个循环是等效的。然而,在实际代码中,事情通常会更复杂一些,在这种情况下,“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入门)感兴趣。
<n
是最常用的(我的看法)
我通常使用 < 来做第二种方式。但是考虑使用 != 因为 c++ 中的 stl 迭代器以这种方式工作。
第二。它总是会在某个时候完成(假设你没有做任何有趣的事情,比如在循环中玩计数器的值)。
我从来没有见过第一次使用,至少,不是那样的。
我更喜欢使用 < ,因为只需查看代码,您就可以知道它是一个递增的循环,它支持您使用 i++ 的事实。
如果您使用 i++ 和 < 并且由于某种原因(其他编码器、拼写错误、人为错误),您的代码会将增量更改为 i——您会立即知道循环没有被评估,就像 != 它会工作无论哪种方式都使调试变得不那么简单。
我看不出这很重要,难道没有更重要的事情要担心吗?
我总是使用后者,这是我见过的最多的。
有人肯定会因为它而将我击落....
“i < n”更好。因为如果你使用 "i != n" 并且在某些情况下你的初始 i 大于 n,你将进入一个无限循环。
如果您正在优化速度,我相信这是一个更好的选择:
int n = 5;
for(int i = n;i > 0;i--)
{
//executing 5times
}
原因是与 0 比较更快。
我说这取决于迭代器变量的类型。如果你知道它是一个整数,我会使用第二个,因为你可以说
循环,只要 i 小于n
我认为对于大多数程序员来说更容易阅读,包括我自己。如果你不知道迭代器变量的类型,你应该尽可能少地假设它的能力。operator<
可能不可用:i
如果它是随机访问迭代器以外的任何迭代器,operator<
则不保证可用。在这种情况下,我会使用operator!=
.
我会避免选择选项<
,因为您可能会不小心“跨过”最终值。我认为这个论点是有缺陷的。因为如果您确实不小心踩到了,那么这是一个错误,应该尽快注意到(Fail-fast)。