尽管我们已经有了“while循环”或副版本,为什么会创建“for循环”?

时间:2013-06-24 12:20:31

标签: for-loop while-loop

我无法弄清楚为什么for loop尽管有while loop而被创建。 在我看来,即使有人说当我们不知道迭代次数时使用while loop,它们也是一样的。在这种情况下,我们也可以使用for loop,我们可以吗?

例如,

For循环:

for (;true;)
{
    document.write("Hello World <br>");
    if(somecondition){
       break;
    }
}

while循环:

while (true)
{
    document.write("Hello World <br>");
    if(somecondition){
       break;
    }
}

而且,两种循环的复杂性是相等的。那么,为什么循环不被删除而只剩下一种?

5 个答案:

答案 0 :(得分:3)

简短回答:它们都是syntactic sugar,这使得程序员而不是机器更容易解释代码。

你给出的方法都没有或多或少有效,并且每个for循环都可以写成while循环。不同之处在于它使其对另一个程序员更具可读性。

让我们看一下Python的例子:

for line in file.readline():

我不需要在此代码块中看到任何其他内容来了解​​其意图。它读取一个文件,如下例所示:

readline = file.readline()
while readline != "":
    # some code
    readline = file.readline()

目前尚不清楚发生了什么,但目的就在于此。最糟糕的是:

while true:
    readline = file.readline()
    if readline == "":
        break

我现在需要进一步阅读循环以获得相同的洞察力。如上所述,while循环和for循环为程序员提供了更易读,更易维护的代码。

答案 1 :(得分:2)

实际上,使用for循环可以执行的任何操作也可以通过while循环完成。以下两个是等效的:

for (initialCondition; test; nextStep) {
  doSomething;
}

initialCondition;
while (test) {
  doSomething;
  nextStep;
}

那为什么我们有for循环呢?有两个原因。

首先,第二个代码片段中的模式非常常见(初始化某些内容,然后在每个步骤更新时循环,直到条件失败)。因为它很常见,许多语言设计者认为有一个特殊的语法是值得的。

其次,将迭代变量(例如ij)移出循环体并在for内部,使编译器和解释器更容易检测某些类型的错误(或也许甚至禁止他们)。例如,如果我写(在MATLAB中,因为我碰巧打开它)

for i = 1:10
  i = i + 5;   // The body of
  disp(i);     // the loop.
end

然后MATLAB给我一个警告 - "Line 2: Loop index 'i' is changing inside a FOR loop"。如果我把它写成while循环:

i = 1;
while i <= 10
  i = i + 5;   // The body of
  disp(i);     // the loop.
  i = i + 1;
end

嗯,哦!我不仅不再收到MATLAB的警告,现在我的代码不正确!修改循环体中的迭代变量是很危险的,而且你很少想要这样做。将“初始化,测试,更新”循环写为for循环而不是while循环有助于保护您免受此类错误的影响。

答案 2 :(得分:1)

他们在语义上是等价的。 for(x;y;z) { foo; }相当于x; while (y) { foo; z; }。它们在标准的其他版本中并不完全等效,在for (int x = 0; y; z),的示例中,x的范围是for block,并且在循环结束后超出范围,而int x; while (y) x在循环结束后它仍在范围内。

另一个不同之处在于,将y的缺失解释为TRUE,而必须提供表达式。 for (;;) { foo; }很好,但while() { foo; }不是。

Source

Author

答案 3 :(得分:1)

你是对的,for循环可以转换为while循环,反之亦然。您甚至可以将它们转换为do-while循环。

ifswitch相同。为什么在使用if时也可以进行切换?

我认为它主要是出于可读性和维护原因。请考虑以下代码:

int i=0;
while(i < array.length){
    doStuff(array[i]);
    i++;
}

现在,另一位开发人员在此循环中添加了功能:

int i=0;
do();
some();
i = other(); // oops, didn't see that i was used for the loop
stuff();
while(i < array.length){
    doStuff(array[i]);
    i++;
    doMoreStuff(array[i]); // oops, did't see i was already incremented
}

使用

for(int i=0; i<array.length; i++){
    doStuff(array[i]);
    doMoreStuff(array[i]);
}
  • 更容易阅读(您知道循环何时开始以及何时结束)
  • 更强大的错误(i作用于for循环)
  • 因此,维护起来更容易

答案 4 :(得分:1)

是的,我认为你不需要它们:

Label1:
document.write("Hello World <br>");
if(somecondition) goto Label2;
goto Label1;

Label2: