我有一个形式的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)
}
虽然它的线条较少,但我仍然认为我的代码更优雅 - 你怎么看?
答案 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)
回答有关我会选择哪些代码的问题;我选择你的长码。它更容易阅读第一个(更长的)循环。是的,我可以阅读第二个,但即使你有很多经验,你必须看两次才能知道循环的作用。此外,编译器还可以很好地优化代码。