C++ 在“a”中;至于;语句,是否应该使用“!=”还是<;`?

C++ 在“a”中;至于;语句,是否应该使用“!=”还是<;`?,c++,loops,for-loop,conditional-statements,C++,Loops,For Loop,Conditional Statements,我已经看到了这两个for语句: for(i=0;i<10;i++) for(i=0;i!=10;i++) for(i=0;i这两种方法在大多数情况下都有效 如果由于某种原因,在循环中执行的代码体将i更改为大于10,则第一个版本将停止循环,但第二个版本将永远执行 for(i = start; i != end; ++i) 这是“标准”迭代器循环。它的优点是,它可以与指针和标准库迭代器一起工作(您不能依赖具有运算符!=的迭代器)。如果i的值超过10,

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

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

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

for(i=0;i这两种方法在大多数情况下都有效

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

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

这是“标准”迭代器循环。它的优点是,它可以与指针和标准库迭代器一起工作(您不能依赖具有
运算符!=的迭代器)。如果i的值超过10,<将允许测试计算true,如果i超过10,<将导致它计算false,或者仅仅变得等于它

如果i的值可能在循环体中更改,这可能是一个考虑因素

然而,如果你只是想做一些固定次数的事情,<更具描述性,但任何一种都足够了。!=对于简单的10项分步式循环,就明确你的意图而言,应该被认为是次优的

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

这是一个微观优化。对于(初始化;终止条件;迭代)


对于其中的每一个,请选择最适合您需求的一个,对于
终止条件
,您可以使用任何二进制条件运算符,例如
=
我的日常做法是使用
最好的做法是只使用迭代器(C++)和<否则。永远不要将==或!=与浮点/双精度一起使用。以下循环是无限循环:

for (double i = 0.0; i != 1.0; i += 0.1)
    printf("yes, I'm an infinite loop ;)");
我通常使用
pNow假设我们在循环保护中使用了code/code,那么之后我们所知道的就是codepos=N | | a[pos]!=5/代码,但这不是我们想要的情况。做更多的工作,我们可以证明我们不可能在codepos>N
中,但与仅在循环保护中使用
!=
相比,这简直是浪费时间。

只是为了说明一下,在for循环中,
+i
i++/code>更好,因为第二个存储
i
的前一个值,而第一个值不存储。@PaulManta:我认为大多数现代编译器都能够发现中间值未使用,并对其进行优化。@BrendanLong:对于基本类型,它可以。对于迭代器,
++i
至少会同样快,甚至更快。@arne是的,现代编译器ers通常会这样做……但“通常”部分让我感到不舒服。:)总是以
++i
的形式编写它,而不依赖编译器来优化它,这并不是我的任何成本。@PaulManta:这是一个完全不同的故事;)我通常也写
++I
,这样无论
I
的类型如何,我的代码看起来都是一样的。谢谢!我曾经认为所有迭代器在你的评论中都有一个
错误的位置。我想,你应该对@BrendanLong说。我们应该申请
模板std::迭代器\u comparison\u traits
,成员typedef是这样的分别计算为
std::less
std::not_等于
。实际上,对于指针/迭代器,只有在迭代范围的一部分时才更安全。如果
end
表示范围的结束,则超过
end
是未定义的行为,因此,无论条件如何,所有赌注都将被取消。同意——idea认为它更安全有些简单。如果你的循环没有做你认为它正在做的事情,那么它就不安全。我想把我听到的作为“最佳实践”来介绍尽管如此。假设有人决定通过将循环变量设置为结束值来终止循环,而不是出于某种原因调用break。然后你增加整数并进行比较,结果不相等……我认为第二种形式不太可能让人意外地弄糟。@Matthieu M。-是的,超过结束是未定义的行为r、 但这不是不可能的。如果超过了结尾,你愿意使用
!=
并抛出异常吗?@NathanLong:我的观点是,如果你调用未定义的行为,那么无论你使用
!=
还是
,假设将
i
设置为11产生无限循环不是有意的(或者不管怎样,它一直持续到将其设置为9),在这种情况下,您将使用
i!=10
。就我个人而言,我不认为有人破坏了您自己的循环不变量,那么编写代码进行防御是值得的——或者循环体应该修改
i
(在这种情况下,您编写的代码有点粗糙,无论终止条件是什么,都必须小心),或者不应该这样做(在这种情况下,我不会费心尝试默默地处理这样做的循环体,因为它无论如何都有bug)@Steve说得很好。如果你担心有人在你的代码中设置i=11,所以你使用iAlso,那么第二个选项假设你在循环体中从不增加i。如果你碰巧这样做,你可能会进入一个无限循环。我个人同意@VJo,认为代码应该首先表达它的意图。所以对我来说他真正的问题是,你是在我10岁之前还是在我不是10岁的时候才尝试循环?
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)
 .
 .
 .
}
for (double i = 0.0; i != 1.0; i += 0.1)
    printf("yes, I'm an infinite loop ;)");
int pos = 0;
// Inv: a[0..pos) = 5
while (pos != N && a[pos] == 5)
    pos = pos+1;