从for循环转换为while循环的正确方法是什么?

时间:2009-11-03 17:26:39

标签: coding-style pseudocode

我有一个形式的for循环:

for (int i = from; i < to; i++) {
  // do some code (I don't know exactly what, it is subject to change)
}

我想将它转换为while循环(主要是因为我想在循环中使用i的值来向前和向后循环,我的同事认为在for循环中执行此操作很容易出问题。我倾向于同意他的意见)。所以我写了这样的话:

int i = from;
while (i < to) {
  try {
    // do some code (I don't know exactly what, it is subject to change)
  } finally {
    i++;
  }
}

这引起了一些响亮的评论。我的理由是你不知道循环中的代码是什么 - 它可能(并且确实)有多个continue命令。

作为回应,他写道:

int i = from - 1;
while (++i < to) {
  // do some code (I don't know exactly what, it is subject to change)
}

虽然它的线条较少,但我仍然认为我的代码更优雅 - 你怎么看?

6 个答案:

答案 0 :(得分:5)

在循环结构中使用索引的值很容易出现问题,无论循环结构是什么

如果它是for循环或while循环并不重要,重点是索引器最终会引导你做出循环终止的决定吗?

如果您确信自己的索引器最终会导致您的退出条件得以实现,那么这就是您应该关注的全部内容,而不是是否使用了一段时间。

答案 1 :(得分:3)

  

我想将它转换为while循环(主要是因为我想在循环中使用i的值来向后和向前循环而且我的同事认为在for循环中执行此操作很容易出现问题我倾向于同意他的意见。

这在大多数语言中都是完全可以接受的。没有理由避免for循环。

答案 2 :(得分:2)

在我看来,它可能更容易并且更具可读性将其转换为:

while (condition == true) {
   // do stuff
   // set the condition flag appropriately
}

因此将循环的终止与变量递增分开。

如果我看到一个带限制检查的循环(例如i < limit),我倾向于假设存在一个以(合理)一致的方式修改的变量。没有理由不能做你想做的事,但我倾向于更可读和更期望的行为。

答案 3 :(得分:1)

为什么在你可以用强大的goto做同样的事情(以及更多!)时会烦恼愚蠢的循环?

i = fro;
my_loop:
//all your stuff here
i++;
if (i < to) goto my_loop;

如果你是那些使goto缩小的弱势程序员之一,那么你可以试试这个:

i = fro;
while(1) {
    //your stuff here
    if (++i < to) break;
}

答案 4 :(得分:0)

最简单的方法是不转换为while循环,例如下面的。

for (int i = from; i < to; ) {
  // do some code (I don't know exactly what, it is subject to change)
  i += rand()*10;
}

答案 5 :(得分:0)

回答有关我会选择哪些代码的问题;我选择你的长码。它更容易阅读第一个(更长的)循环。是的,我可以阅读第二个,但即使你有很多经验,你必须看两次才能知道循环的作用。此外,编译器还可以很好地优化代码。