在"for"语句中,我应该使用"!="还是"<"?

In a "for" statement, should I use `!=` or `<`?

本文关键字:还是 lt 语句 for 我应该      更新时间:2023-10-16

这两个for语句我都见过:

for(i=0;i<10;i++) 
for(i=0;i!=10;i++)

我知道当I达到10时它们都停止了,但似乎使用第二个更好(我听说)。有什么不同?我还想知道当使用迭代器访问vector的成员时,迭代器条件< vec.end()!= vec.end()的区别是什么

for(i = start; i != end; ++i)

这是"标准的"迭代器循环。它的优点是它可以与指针和标准库迭代器一起工作(你不能依赖于定义了operator<的迭代器)。

for(i = start; i < end; ++i)

这对标准库迭代器不起作用(除非它们定义了operator<),但它确实有一个优点,如果由于某种原因超过了end,它仍然会停止,所以它稍微安全一些。我被教导在迭代整数时使用这个,但我不知道它是否实际上被认为是"最佳实践"。

我通常使用<

这两种方法在大多数情况下都可以。

如果由于某种原因,在循环中执行的代码体将i更改为大于10的值,则第一个版本将停止循环,但第二个版本将永远执行。

我的日常实践是当我使用简单类型(如整数)迭代循环时使用<,当我使用静态迭代器时使用!=

for ( initialization ; termination condition ; iteration )

对于每一个,选择你自己最适合你的要求,对于termination condition,你可以使用任何二进制条件运算符,如>, <, >=, <=, !=

对于给定的问题,考虑一个随机的情况,

for(i=0;i!=10;i++)
{
 .
 .
 i=11; //somewhere if the loop variable is changed to a value greater than 10 (this assumption is solely for demo)
 .
 .
 .
}

在这种情况下,循环是无限的。相反,如果您使用条件i<10,则会像往常一样工作。所以我的观点是,第一种方法严格设置条件更安全一些。

最佳实践是只对迭代器(c++)和

for (double i = 0.0; i != 1.0; i += 0.1)
    printf("yes, I'm an infinite loop ;)");

!如果I的值超过10,=将允许测试计算为true,而<如果我超过10或仅仅等于它,将导致它的值为false。>

如果i的值可能在循环体中改变,则可以考虑这样做。

然而,如果你只是想要做某件事几次,<更具有描述性,但两者都可以。对于简单的一步一步完成10个项目并完成大量工作的循环,应该被认为是次优的,因为它明确了你的意图。>

我知道当I达到10时它们都停止了,但似乎使用它更好第二个(我听到)。

这是一个微优化。使用更有意义的内容(<以上内容更有意义)。

有什么不同?

第一个版本使用不等运算符!=,第二个版本使用小运算符<

我通常在for循环中使用<,原因由其他人说明。然而,在while循环和更高级的for循环中,!=使我们更容易推断程序所做的工作。

假设我想找到在[5,5,5,3,5,2,3,2,0]这样的数组中第一次运行'5'后的位置。也就是说,我们希望k0 <= i < k => a[i] = 5:

int pos = 0;
// Inv: a[0..pos) = 5
while (pos != N && a[pos] == 5)
    pos = pos+1;

一旦循环执行,我们知道循环保护的反向为真:pos == N || a[pos] != 5。在任何一种情况下,我们都有我们想要的pos

现在假设我们在循环保护中使用了<,那么之后我们所知道的就是pos >= N || a[pos] != 5,但这不是我们想要的情况。做了更多的工作,我们可以证明我们不可能在pos > N中,但与在循环保护中只使用!=相比,这似乎是浪费时间。