1

我有一个形式的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)
}

尽管它的行数更少,但我仍然认为我的代码更优雅——你怎么看?

4

6 回答 6

5

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

不管是for循环还是while循环都没有关系,关键是索引器最终会引导你做出循环终止的决定吗?

如果你确信你的索引器最终会导致你的退出条件得到实现,那么这就是你应该关心的,而不是是否使用 a for 或一段时间。

于 2009-11-03T17:31:02.103 回答
3

而且我想将它转换为while循环(主要是因为我想在循环中使用 i 的值来回前进,而我的同事认为在 for 循环中这样做很容易出现问题。我倾向于同意他的观点)。

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

于 2009-11-03T17:30:34.693 回答
2

在我看来,将其转换为:

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

从而将循环的终止与变量增量分开。

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

于 2009-11-03T17:34:56.713 回答
1

当你可以用 uber-powerful 做同样的事情(甚至更多!)时,为什么还要为愚蠢的循环而烦恼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;
}
于 2009-11-03T17:38:50.557 回答
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;
}
于 2009-11-03T17:33:15.607 回答
0

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

于 2009-11-03T17:35:23.397 回答