我应该使用for或while循环来查找链表中的最后一项吗?
Item * last = list;
for (; last->next; last = last->next) ;
与
Item * last = list;
while (last->next)
{
last = last->next;
}
它的2行与5行似乎几乎同样可读。为什么我总是只看到while形式?
答案 0 :(得分:5)
为什么我总是只看到while形式?
首选while
形式有两个原因:
for
循环混乱后发现分号,甚至错过完全是分号,不了解发生了什么。关于while
循环没有这种混淆。for
循环在循环外部声明的循环变量提供了一个强烈的指示,表明您确实需要while
循环 - 循环变量的范围限定为循环体。当你在循环之外声明它们时,这是因为你想要循环结果中循环变量的结束值。答案 1 :(得分:4)
这两个循环在逻辑上是等价的,并且最有可能最终被编译为相同的代码。
使用你喜欢的任何一个。
答案 2 :(得分:2)
如果您要比较行数,至少要尝试合理准确地进行。 for
循环的格式应更像这样:
Item * last = list;
for (; last->next; last = last->next)
;
这使得for
循环(故意)控制空语句更加明显。 while
循环可以写得更像这样:
Item * last = list;
while (last->next)
last = last->next;
如果我们坚持要求即使是一个受控声明也需要大括号,那么它们最终仍然会有相同的行数:
Item * last = list;
for (; last->next; last = last->next) {
;
}
VS
Item * last = list;
while (last->next) {
last = last->next;
}
因此,行数的差异仅仅取决于您选择使用的格式(特别是,您没有使用相同或甚至类似的两种格式)。
其他人已经指出这些可能会编译成相同的代码,我同意你可以(而且应该)期望在任何合理的编译器中都这样。
这使得风格和可读性成为唯一的区别。在这方面,for
循环显然是优选的。一些显然从未早期暴露于BASIC(或可能是FORTRAN)的人坚持认为for
循环应仅用于简单的计数循环,如BASIC和FORTRAN支持的循环。将此限制应用于C或C ++只是错误的头脑和愚蠢。由于一个充分的理由,C for
循环变得更加通用,并且对它施加纯粹的人为限制根本没有任何好处。
简单的经验法则:如果您实际使用for
循环标题中的三个子句中的至少两个,则最好使用for
循环而不是while
循环环。具有空体的for
循环与具有空体的构造函数大致相似:对于不懂语言的人来说可能不熟悉和困惑,但对于任何真正了解语言的人来说,这是微不足道的,就像他们手上的手指一样熟悉。
答案 3 :(得分:1)
因为当你知道要做多少步时会使用for-loop。而且,这个循环的变量可以是私有的(迭代器)。
在条件满足之前使用while-loop。您可以使用此循环模拟所有循环。
然而,正如人们可以很容易看到的,两者都可以使用,因为它们是等价的。