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

Arc*_*rus 53 c++ loops for-loop conditional-statements

我已经看到这两个声明:

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

for(i=0;i!=10;i++)
Run Code Online (Sandbox Code Playgroud)

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

Rei*_*ica 74

for(i = start; i != end; ++i)
Run Code Online (Sandbox Code Playgroud)

这是"标准"迭代器循环.它的优点是它适用于指针和标准库迭代器(您不能依赖已operator<定义的迭代器).

for(i = start; i < end; ++i)
Run Code Online (Sandbox Code Playgroud)

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

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

  • 实际上,对于指针/迭代器,迭代部分范围时更安全.如果`end`代表范围的结束,那么经过`end`是**未定义的行为**,因此所有的赌注都是关闭的,无论条件如何. (11认同)
  • 同意 - 它更安全的想法有点过分简单.如果你的循环没有按你认为的那样做,那就不安全了.我试图提出我所听到的"最佳实践". (2认同)

Jon*_*n M 12

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

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


fat*_*fat 10

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


COD*_*BOY 7

for ( initialization ; termination condition ; iteration )

对于每一个这种的,选择youself最好的一个,以满足您的要求,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)
 .
 .
 .
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,循环结果是无限的.相反,如果你使用一个条件i<10,这就像往常一样.所以我的观点是,第一种方法是严格设置条件更安全一些.

  • @Steve提出了一个很好的观点.如果你担心有人在你的代码中设置i = 11,那么你使用i <10作为检查条件...为什么你不担心有人只是在你的循环中设置i = 1导致它永远运行? (4认同)
  • 假设设置`i`到11产生一个无限循环(或者无论如何继续直到它将它设置为9)都不是*故意*,在这种情况下你会使用`i!= 10`.就我个人而言,我认为不值得尝试对抗破坏你自己的循环不变量的人进行防御编码 - 要么循环的主体应该修改`i`(在这种情况下你要编写稍微粗糙的代码并且必须小心无论如何终止条件是),或者它不应该(在这种情况下我不会打扰试图静默处理一个循环体,因为它无论如何都是错误的). (3认同)

SOR*_*der 6

最佳实践是使用!=仅使用迭代器(C++)和<否则.永远不要使用==或!=浮点数/双打.以下循环是无限循环:

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


Chr*_*her 5

!=如果i的值超过10,则允许测试评估为真,而如果i超过10或仅仅等于它,则<将导致它评估为假.

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

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