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

Coding style 从for循环转换为while循环的正确方法是什么?,coding-style,pseudocode,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) } 这引起了一些响亮的评论。我的理由是,您不知道循环中的代码是做什么的——它可能(而且确实)有多个continue命令 作为回应,他写道: int i = from - 1; while (++i < to) { // do some code

我有一个for循环的形式:

for (int i = from; i < to; i++) {
  // do some code (I don't know exactly what, it is subject to change)
}
这引起了一些响亮的评论。我的理由是,您不知道循环中的代码是做什么的——它可能(而且确实)有多个
continue
命令

作为回应,他写道:

int i = from - 1;
while (++i < to) {
  // do some code (I don't know exactly what, it is subject to change)
}
inti=from-1;
而(++i
虽然行数更少,但我仍然认为我的代码更优雅——你怎么看

我想把它转换成一个while循环(主要是因为我想在循环中使用I的值来来回移动,我的同事认为在for循环中这样做容易出现问题。我倾向于同意他的观点)

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

我想把它转换成一个while循环(主要是因为我想在循环中使用I的值来来回移动,我的同事认为在for循环中这样做容易出现问题。我倾向于同意他的观点)


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

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

不管是for循环还是while循环,关键是索引器最终会引导您做出循环终止的决定吗


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

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

不管是for循环还是while循环,关键是索引器最终会引导您做出循环终止的决定吗


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

最简单的方法是不要转换为while循环,如下所示

for (int i = from; i < to; ) {
  // do some code (I don't know exactly what, it is subject to change)
  i += rand()*10;
}
for(int i=from;i
最简单的方法是不要转换成while循环,如下所示

for (int i = from; i < to; ) {
  // do some code (I don't know exactly what, it is subject to change)
  i += rand()*10;
}
for(int i=from;i
在我看来,将其转换为:

while (condition == true) {
   // do stuff
   // set the condition flag appropriately
}
从而将循环的终止与变量的增量分开


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

在我看来,将其转换为:

while (condition == true) {
   // do stuff
   // set the condition flag appropriately
}
从而将循环的终止与变量的增量分开


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

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

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

既然你可以用超级强大的
goto
做同样的事情(甚至更多!),为什么还要费心处理愚蠢的循环呢

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

既然你可以用uber强大的
goto
做同样的事情(甚至更多!),为什么还要费心去做愚蠢的循环呢

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

少行,多增量一行。你几乎是对的:你不需要尝试…最后。当抛出异常时,i不会增加!呃:-)。但说真的-原始代码是一个for循环,限制了
i
的范围。由于转换的目的不是使
i
在循环范围之外可见,因此i的值对于处理异常来说无关紧要。行数减少,但增量增加一行。你几乎是对的:你不需要尝试…最后。当抛出异常时,i不会增加!呃:-)。但说真的-原始代码是一个for循环,限制了
i
的范围。由于转换的目的不是使
i
在循环范围之外可见,因此i的值对于处理异常来说并不重要。虽然我同意通常情况下不应该这样做,但许多动态算法要求您的索引急剧更改以提高效率。@icco这里没有参数。我只是说,当你开始改变索引时,你应该一直小心。我同意约瑟夫的观点。坏主意。虽然我同意一般情况下你不应该这样做,但许多动态算法要求你的索引大幅改变以提高效率。@icco这里没有任何论据。我只是说,当你开始改变索引时,你应该一直小心。我同意约瑟夫的观点。坏主意。@Reed和@Joseph-你们都是对的,但随着代码的更新和变得更加复杂,使用while循环可以降低明显的复杂性