为什么使用for循环而不是while循环?

Zig*_*ggy 67 loops coding-style control-flow

可能重复:
使用for循环或while循环迭代?
C中的循环 - ()或while() - 哪个最好?

什么时候应该使用for循环而不是while循环?

我认为以下循环是相同的,除了它们的语法.如果是这样,为什么选择一个而不是另一个呢?

int i;
for (i = 0; i < arr.length; i++) {
  // do work
}

int i = 0;
while (i < arr.length) {
  // do work
  i++;
}
Run Code Online (Sandbox Code Playgroud)

jjn*_*guy 102

在您的情况下,除了for循环中少一行代码之外,您不会获得太多收益.

但是,如果你像这样声明循环:

for(int i = 0; i < x; i++)
Run Code Online (Sandbox Code Playgroud)

您设法保持i在循环的范围内,而不是让它转义到代码的其余部分.

此外,在while循环中,您有3个不同位置的变量声明,条件和增量.有了for循环,它就在一个方便,易读的地方.

最后的想法:
一个更重要的说明.两者之间存在语义差异.虽然循环通常意味着具有无限次迭代次数.(即直到文件被读取..无论其中有多少行),for循环应具有更确定的迭代次数.(循环遍历集合中的所有元素,我们可以根据集合的大小对其进行计数.)

  • 我提到计数器变量范围的`+ 1`. (11认同)
  • @Ziggy:一般来说,更高的数据位置是好的.在这种情况下,一个优点是您可以在同一范围内的不同循环中使用相同的计数器变量名称(经典的`i`).此外,如果计数器变量"循环"在它们的循环后面,它们可能会被"回收"以用于以后的代码,然后可能意外地依赖于它们具有特定值作为循环中的剩余部分.我想有人可以提出无数的这种情况. (11认同)
  • ......用某些语言 在其他人,不是. (6认同)
  • @Ziggy嗯,假设你有多个循环.使用for循环,所有循环计数器都是循环的本地.您可以在循环中使用通用名称(如"i"),而无需担心声明与已存在的变量同名的变量. (2认同)
  • @sbi:您可以在多个循环中重用变量名,无论您是在内部还是外部声明它.在后一种情况下,您正在重用变量本身.问题不在于它是*不可能*,而是它*风险*,因为您可能忘记重新初始化它. (2认同)

Ree*_*sey 85

有一个理由去选择forwhile:可读性.

通过使用for循环,您明确表示您的意图是执行某些类型的操作,需要初始化,"步骤"操作和完成条件.

随着while,在另一方面,你只说你需要完成条件.

  • @Justin:我没有说"只有一个" - 但坦率地说,我认为你的理由主要是在可读性之下...... (3认同)

Otá*_*cio 35

当我不一定需要计数器时,我使用'while',例如当你从文件中读取并且你正在等待达到EOF时.在这种情况下,'for'可能不是最好的选择.当你浏览阵列上的项目时,我宁愿使用'for',因为它更好地传达了意图.

  • 是的,使用变量的时间是*计数器*直观. (36认同)
  • @Bill K,哈哈可怕的笑话 (4认同)

sup*_*cat 27

for()和while()循环之间的一个值得注意的区别是while()循环中的"continue"语句将分支到循环的顶部,而for()循环中的一个将分支到第三个部分of()子句[条件之后的那个,通常用于碰撞变量].


Cap*_*ffe 16

作为一名教师,我一直在思考各种形式和形式; 我的建议总是归结为

  • for-loops用于计数.数数,倒计时.
  • while/ do-whileconstructs适用于所有其他条件. c!=EOF,diff<0.02等等.迭代器/枚举器是非常适合for循环的计数器.

即你的int=0; while( ... )眼睛是可怕的.


Bab*_*fas 15

为什么选择Coke over Pepsi?

在WHILE和FOR循环之间,您可以互换使用它们.要成为纯粹主义者,您可以根据条件的性质做出决定.如果您正在执行基于计数的循环,那么FOR循环将是最有意义的.

for( cur = 0; cur < myList.Length; cur++ ){
    doSomething( myList[cur] );
}
Run Code Online (Sandbox Code Playgroud)

如果您正在执行基于逻辑的循环,那么WHILE将实现最干净的实现

Iterator i = myObject.getIterator();
while( i.hasNext() ){
    doSomething( i.next() );
}
Run Code Online (Sandbox Code Playgroud)

  • 我仍然认为使用迭代器for-loop仍然是更清晰的实现:`for(Iterator i = myObject.getIterator(); i.hasNext(); i.next())`; for循环的迭代器版本看起来与使用for-int-looping非常相似.当你想要强调循环在达到某个条件时停止时,while循环更清晰,并且停止条件既不是循环计数器也不是迭代器(例如GUI主循环,终止条件是按下退出按钮时) . (4认同)
  • @Lie Ryan:问题在于像Java这样具有这种迭代器风格的语言,`i.next()`通常*返回*元素 - 没有推进迭代器就无法访问元素.(当然,你使用`foreach`代替.C++迭代器没有这个问题,`for`在那里很自然.) (2认同)

Pis*_*3.0 7

正如你所说,原因是语义和美学,而不是性能(他们编译的代码往往非常相似).

也就是说,for通常在循环中具有已知的迭代次数,而while暗示条件不一定与您在循环中所做的内容相关,或者您在开始时不知道有多少次迭代是.


Bil*_*eal 7

通常,我总是喜欢循环,即使循环与计数无关的情况,因为它将循环的维护本地化在一个位置.当其他人出现并决定添加/修改循环时,如果他们使用FOR循环,那么进行修改的人通常可以确信,只要他们不会弄乱FOR表达式中的项目,他们不会在循环中打破迭代.

但是,像while循环这样的东西需要程序员完全解析循环体,并理解它是如何迭代的,以确保它们在进行更改时保持循环维护代码不变,并且顺序正确.

因此,在我只有效地需要FOR的中间部分的情况下,我使用WHILE.