我无法弄清楚为什么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;
}
}
而且,两种循环的复杂性是相等的。那么,为什么循环不被删除而只剩下一种?
答案 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循环呢?有两个原因。
首先,第二个代码片段中的模式非常常见(初始化某些内容,然后在每个步骤更新时循环,直到条件失败)。因为它很常见,许多语言设计者认为有一个特殊的语法是值得的。
其次,将迭代变量(例如i
或j
)移出循环体并在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; }
不是。
答案 3 :(得分:1)
你是对的,for循环可以转换为while循环,反之亦然。您甚至可以将它们转换为do-while循环。
与if
和switch
相同。为什么在使用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: