它是关于 PHP 的,但我毫不怀疑许多相同的评论将适用于其他语言。
简单来说,PHP 不同类型的循环有什么区别?一个比其他更快/更好,还是我应该简单地放入最易读的循环?
for ($i = 0; $i < 10; $i++)
{
# code...
}
foreach ($array as $index => $value)
{
# code...
}
do
{
# code...
}
while ($flag == false);
For 循环和 While 循环是入口条件循环。他们首先评估条件,因此即使条件不满足,与循环关联的语句块也不会运行一次
这个 for 循环块中的语句将运行 10 次,$i 的值将是 0 到 9;
for ($i = 0; $i < 10; $i++)
{
# code...
}
用 while 循环做同样的事情:
$i = 0;
while ($i < 10)
{
# code...
$i++
}
Do-while 循环是退出条件循环。它保证执行一次,然后它会在重复块之前评估条件
do
{
# code...
}
while ($flag == false);
foreach 用于从头到尾访问数组元素。在 foreach 循环开始时,将数组的内部指针设置为数组的第一个元素,下一步将其设置为数组的第二个元素,依此类推,直到数组结束。在循环块中,当前数组项的值以 $value 的形式提供,当前项的键以 $index 的形式提供。
foreach ($array as $index => $value)
{
# code...
}
你可以用 while 循环做同样的事情,像这样
while (current($array))
{
$index = key($array); // to get key of the current element
$value = $array[$index]; // to get value of current element
# code ...
next($array); // advance the internal array pointer of $array
}
最后:PHP 手册是您的朋友 :)
这是 CS101,但由于没有其他人提到它,while 循环在代码块之前评估它们的条件,而 do-while 在代码块之后评估它们,所以 do-while 循环总是保证至少运行一次它们的代码块,不管条件如何。
@布伦丹:
您引用的文章严重过时,信息完全错误。特别是最后一点(使用for
而不是foreach
)具有误导性,并且文章中提供的理由不再适用于现代版本的 .NET。
虽然确实IEnumerator
使用了虚拟调用,但这些实际上可以由现代编译器内联。此外,.NET 现在知道泛型和强类型枚举器。
有很多性能测试最终证明for
通常不会比foreach
. 这是一个例子。
我在遍历常规(索引?)数组时使用第一个循环,在处理关联数组时使用 foreach 循环。在我看来,它看起来很自然,有助于代码流动并更具可读性。至于 do...while 循环,当我不得不做的不仅仅是遍历数组时,我会使用它们。
不过,我不确定是否有任何性能优势。
在这两种情况下,性能都没有明显好转。虽然对于比迭代更复杂的任务有用,但在功能上是等效的for
。while
Foreach
很好,但有一个重要的警告:你不能修改你正在迭代的枚举。因此,不要删除、添加或替换其中的条目。当然,修改条目(比如更改它们的属性)是可以的。
使用 foreach 循环,在内存中制作原始数组的副本以供内部使用。你不应该在大型结构上使用它们;一个简单的 for 循环是更好的选择。您可以在大型非数字索引结构上更有效地使用 while 循环,如下所示:
while(list($key, $value) = each($array)) {
但是这种方法对于一个简单的小型结构来说特别难看。
while 循环更适合循环流,或者像下面在 PHP 中经常看到的示例:
while ($row = mysql_fetch_array($result)) {
几乎所有时候,不同的循环都是可以互换的,这将归结为 a) 效率或 b) 清晰度。
如果您知道不同类型循环的效率权衡,那么可以回答您最初的问题:使用看起来最干净的循环。
在性能方面,foreach 比 for 更消耗
每个循环结构都有不同的用途。
for - 这用于循环特定数量的迭代。
foreach - 这用于循环遍历集合中的所有值。
while - 这用于循环直到满足条件。
在这三个中,“while”很可能在大多数情况下提供最佳性能。当然,如果您执行以下操作,则基本上是在重写“for”循环(在 c# 中它的性能略高一些)。
$count = 0;
do
{
...
$count++;
}
while ($count < 10);
它们都有不同的基本用途,但也可以以相同的方式使用。这完全取决于您要解决的具体问题。
使用 foreach 循环,在内存中制作原始数组的副本以供内部使用。
Foreach 很好,但有一个重要的警告:你不能修改你正在迭代的枚举。
如果您通过引用而不是值传递,这两个都不会成为问题:
foreach ($array as &$value) {
我认为这是自 PHP 5 以来允许的。
在访问数组的元素时,为了清楚起见,我会尽可能使用 foreach,并且仅在需要实际索引值时才使用 for(例如,多个数组中的相同索引)。这也最大限度地减少了拼写错误的机会,因为 for 循环使这一切变得太容易了。一般来说,PHP 可能不是过分担心性能的地方。最后但并非最不重要的一点是,for 和 foreach 具有(或应该具有;我不是 PHP-er)相同的 Big-O 时间(O(n)),因此您可能正在查看更多的内存使用量或轻微的恒定或线性时间冲击。