在“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
,但是这个接缝像浪费时间只是在环卫中使用!=
。