C++ 用于vs,用于查找链表中的最后一项

C++ 用于vs,用于查找链表中的最后一项,c++,c++11,for-loop,while-loop,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形式?这两个循环在逻辑上是等价的,很可能最终会被编译成相同的代码 使用您喜欢的任何一个。

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

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

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

它是2行,而不是5行,看起来几乎同样可读。为什么我总是只看到while形式?

这两个循环在逻辑上是等价的,很可能最终会被编译成相同的代码

使用您喜欢的任何一个。

因为当您知道要执行多少步时,就会使用。此外,这个循环可以有它的私有变量(迭代器)

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

然而,很容易看出,两者都可以使用,因为它们是等效的

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

首选
while
格式有两个原因:

  • 具有空体的循环的可读性不如其体中至少有一条语句的循环——C新手发现
    for
    循环后面的分号令人困惑,甚至完全忽略了分号,不理解发生了什么。关于
    while
    循环没有这种混淆
  • 对于在循环外部声明了循环变量的
    循环,提供了一个强有力的指示,表明您实际上需要一个
    ,而
    循环
    -循环变量的作用域是循环体。当您在循环外部声明它们时,这是因为您希望在循环的结果中包含循环变量的结束值

如果要比较测线计数,至少要尽量做到合理准确。
for
循环的
格式应如下所示:

Item * last = list;
for (; last->next; last = last->next) 
    ;
Item * last = list;
while (last->next)
    last = last->next;
这使得
for
循环(有意地)控制空语句变得更加明显。
while
循环可以写得更像这样:

Item * last = list;
for (; last->next; last = last->next) 
    ;
Item * last = list;
while (last->next)
    last = last->next;
如果我们坚持在一条受控语句周围使用大括号,那么它们的行数仍然相同:

Item * last = list;
for (; last->next; last = last->next) {
    ;
}
vs:

因此,行数的差异完全是由于您选择使用的格式(尤其是,您没有对这两种格式使用相同甚至相似的格式)

其他人已经指出,这些代码可能会编译成相同的代码,我同意,对于任何合理的编译器,您都可以(也应该)期望这是正确的

这使得风格和可读性成为唯一的区别。在这方面,
for循环显然更可取。一些显然从未从早期接触BASIC(或可能是FORTRAN)中恢复过来的人坚持认为
for
循环应该只用于简单计数的循环,如BASIC和FORTRAN支持的循环。把这个限制应用到C或C++是简单的错误和愚蠢的。C的for循环变得更加通用是有充分理由的,对它进行纯粹的人为限制对任何人都没有好处


简单的经验法则:如果实际上在
for
循环的标题中使用了三个子句中的至少两个,那么最好使用
for
循环,而不是
while
循环。带有空体的
for
循环大致类似于带有空体的构造函数:对于不懂该语言的人来说,它可能是不熟悉和令人困惑的,但是对于真正懂该语言的人来说,它很简单,就像他们手上的手指一样熟悉。

for循环的
通常表明循环变量是循环的私有局部细节。如果循环的目的是更改其他外部变量,那么
while
版本在这方面就更清晰了。特别是,如果for循环的增量部分改变了外部状态,这可能很难看到,也很容易混淆。我相信这两者都是相同的wrt内存和时间。这几乎是个人偏好。@BatCoder:这就是为什么不应该使用for循环的原因。让读者感到困惑的时间太长了。while循环也可能是两行。5.我不知道第二点是什么。如果循环有一个
continue
,您可能仍然需要
for
提供的迭代保证。