繁体   English   中英

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

[英]In a “for” statement, should I use `!=` or `<`?

我已经看到这两个声明:

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

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

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

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

这是“标准”迭代器循环。 它的优点是它适用于指针和标准库迭代器(您不能依赖具有operator< defined的迭代器)。

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

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

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

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

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

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

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,则允许测试评估为真,而如果i超过10或仅仅等于它,则<将导致它评估为假。

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

但是,如果您只是想要做一些事情,<更具描述性,但要么就足够了。 !=对于简单的逐步通过10项和咕噜咕噜的工作类型的循环,在明确你的意图方面被认为是次优的。

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

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

有什么不同?

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

由于其他人所说的原因,我通常使用< in for-loops。 在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 == N || a[pos] != 5 在这两种情况下,我们的pos我们想要的。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM