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

我已经看到这两个两个语句:

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

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

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

这是“标准”迭代器循环。 它的优点是可以同时使用指针和标准库迭代器(不能依赖具有operator<定义的)迭代器。

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

这对标准库迭代器不起作用(除非它们具有operator< defined),但是它的优点是,如果由于某种原因而end ,它将会停止,所以它稍微安全一些。 我被教导使用这个迭代整数,但我不知道它是否被认为是“最佳实践”。

我通常写这些的方式是喜欢<

两者都将在大多数情况下工作。

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

我每天的做法是使用<当我循环与简单的types,如整数,并使用!=当我使用stl类迭代器

for ( initialization ; termination condition ; iteration )

对于其中的每一个,select自己最适合您的要求, 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 ;)"); 

如果我的值超过10,则允许testing评估为true;而如果我超过10或者仅仅等于10,则会导致评估错误。

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

但是,如果你只是想要做某些事情,那么<更具描述性,但是也可以。 对于简单的一步一步的工作types的循环,在明确你的意图方面被认为是不理想的。

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

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

有什么不同?

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

由于其他人陈述的原因,我通常在for循环中使用< 。 在while循环和更高级的for循环中, !=使我更容易理解我的程序的function。

假设我想在[5,5,5,3,5,2,3,2,0]这样的数组中第一次运行'5'之后find位置。 那就是我们要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 == N || a[pos] != 5 。 无论哪种情况,我们都有我们想要的位置。

现在说我们已经在循环守卫中使用了< ,然后所有我们后来知道的是pos >= N || a[pos] != 5 pos >= N || a[pos] != 5 ,但这不是我们想要的情况。做更多的工作,我们可以certificate我们不可能在pos > N ,但是这个接缝像浪费时间只是在环卫中使用!=