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

时间:2011-11-18 06:12:20

标签: c++ loops for-loop conditional-statements

我已经看到这两个声明:

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

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

我知道当我到达10时它们都会停止,但似乎最好使用第二个(我听说过)。 有什么不同?我也想知道何时使用迭代器来访问向量的成员,迭代器条件< vec.end()!= vec.end()

之间的区别是什么

8 个答案:

答案 0 :(得分:74)

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

这是“标准”迭代器循环。它的优点是它可以与指针和标准库迭代器一起使用(您不能依赖定义了operator<的迭代器)。

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

这不适用于标准库迭代器(除非它们定义了operator<),但它的优势在于,如果由于某种原因超过end,它仍会停止,所以它稍微安全一些。我在迭代整数时被教导使用它,但我不知道它是否真的被认为是“最佳实践”。

我通常写这些的方式是首选<

答案 1 :(得分:12)

两者都适用于大多数情况。

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

答案 2 :(得分:10)

我的日常做法是在使用简单类型(如整数)循环时使用<,并在使用stl-kind迭代器时使用!=

答案 3 :(得分:7)

for ( initialization ; termination condition ; iteration )

对于每一个,选择最适合自己的要求,对于termination condition,您可以使用任何二元条件运算符,例如><,{{1 },>=<=

对于您提出的问题,请考虑随机案例,

!=

在这种情况下,循环结果是无限的。相反,如果你使用条件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) . . . } ,这就像往常一样。所以我的观点是第一种方法更严格地设置条件严格

答案 4 :(得分:6)

最佳做法是使用!=仅使用迭代器(C ++)和&lt;除此以外。永远不要使用==或!=浮点数/双打。以下循环是无限循环:

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

答案 5 :(得分:5)

如果i的值超过10,

!=将允许测试评估为真,而&lt;如果我超过10或仅仅等于它,会导致它评估为假。

如果i的值可能在循环体内发生变化,这可能是一个考虑因素。

但是,如果你只想做一些事情,那么&lt;更具描述性,但要么就足够了。 !=应该,对于简单的逐步完成10个项目和笨拙的工作类型的循环,在明确你的意图方面被认为是次优的。

答案 6 :(得分:4)

  

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

这是微观优化。使用更有意义的东西(以上<更有意义)。

  

有什么不同?

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

答案 7 :(得分:1)

我通常在for循环中使用<,原因是其他人说的。在while循环和更高级的for循环中,!=可以更容易地推断出我的程序的作用。

假设我想在像[5,5,5,3,5,2,3,2,0]这样的数组中第一次运行'5'之后找到位置。我们希望k成为0 <= 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中,但与在循环保护中使用!=相比,这样做会浪费时间。