对于vs同时查找链接列表中的最后一项

时间:2016-05-21 14:04:50

标签: c++ c++11 for-loop while-loop

我应该使用for或while循环来查找链表中的最后一项吗?

Item * last = list;
for (; last->next; last = last->next) ;

Item * last = list;
while (last->next)
{
    last = last->next;
}

它的2行与5行似乎几乎同样可读。为什么我总是只看到while形式?

4 个答案:

答案 0 :(得分:5)

  

为什么我总是只看到while形式?

首选while形式有两个原因:

  • 具有空体的循环不像其身体中至少有一个语句的循环那么可读 - C语言的程序员在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)

因为当你知道要做多少步时会使用。而且,这个循环的变量可以是私有的(迭代器)。

在条件满足之前使用。您可以使用此循环模拟所有循环。

然而,正如人们可以很容易看到的,两者都可以使用,因为它们是等价的。