在循环终止条件中使用 < 或 !=



给定向量v,我想循环遍历向量中的每个元素,并执行需要当前索引的操作。

我已经看到了用这两种方式编写的基本for循环:

// Using "<" in the terminating condition
for (auto i = 0; i < v.size(); ++i)
{
// Do something with v[i]
}
// Using "!=" in the terminating condition
for (auto i = 0; i != v.size(); ++i)
{
// Do something with v[i]
}

有什么实用的理由更喜欢其中一个而不是另一个吗?我经常看到使用<编写它,但是使用!=有性能优势吗?

有一个原因,尽管有点复杂,但更喜欢<而不是!=

如果由于任何原因,lop的主体修改了i并跳过阈值,则<仍然终止循环,其中!=将继续迭代。

在绝大多数情况下,这可能没有什么不同,但习惯<可能会防止!=不会出现的错误。还有一个额外的优势,那就是小得离谱,但<写入的字符更少,所以它使源文件更小。

同样,上面的论点几乎是一个笑话,但如果你需要一个论点来使用一个而不是另一个,那你就有了

您可能更喜欢使用的范围。

有什么实际的理由更喜欢其中一个吗?

没有充分的理由选择这样或那样的方式,因为两者都有相同的行为。

即使结束条件不是累加器的值之一,如果增量大于1或初始值大于结束条件,也可以使用小于运算符。因此,它更通用,这意味着使用它可能总是更一致。一致性是一个弱论点,但如果你同意,弱论点总比没有论点好

性能没有差异

如果您决定以这样的方式更改++i,即循环将跨过所需的末端,则会产生巨大的差异。

为了便于其他程序员阅读您的代码,请使用他们期望看到的约定,即<。当我看到i != ...时;他跳过了那个值;。

这是<的一个模糊错误——假设您使用字节大小的i迭代所有256个chars。该值将溢出,并且可能永远不会显示值256。循环永远不会停止。!=不会修复这个错误。

最新更新