何时在while循环中使用for循环?
为了相同的目的,我们可以使用for循环和while循环。 如果我用而不是在什么时候它们会影响我们的代码呢? 在if-else和switch-case之间出现了同样的问题? 如何决定使用什么? 比如你更喜欢哪一个?
这段代码:
int main() { int n = 10; for(int i=0;i<n;i++) { do_something(); } return 0; }
或者这段代码:
int main() { int n=10,i=0; while(i<n) { do_something(); i++; } return 0; }
如果使用for或while循环不会以任何方式影响代码那么我可能知道需要为同样的问题制作2个解决方案吗?
如果你知道循环应该预先运行的迭代次数,我会推荐for
构造。 虽然循环适用于循环终止条件在某个尚未确定的时间发生的情况。
使用任何一个使您的代码意图最清晰的。
我尝试更喜欢for
循环。 为什么? 因为当我看到一个for
循环时,我可以预期所有循环bookeeping都保存在一个语句中。 我可以插入break
或continue
语句,而不必担心破坏循环的运行方式。 最重要的是,循环的主体侧重于你实际想要循环所做的事情,而不是维护循环本身。 如果我看到一段while
,那么在我能够理解循环使用的迭代模式之前,我必须先查看并理解整个循环体。
我最终使用的唯一地方是那些少数情况,其中循环的控制由一些外部例程提供(即FindFirstFileW
)
这完全是个人意见的问题。 很多人不喜欢我最终使用for
循环,因为循环语句通常最终跨越多行。
通常, for
循环可能更适用于简单循环,因为循环的逻辑包含在一行中:
for (int i = 0; i < 10; ++i) {...}
但是,有时我们需要更复杂的逻辑或流量控制。 while
循环允许我们实现更复杂的循环。 例如,假设我们只想在某些条件下递增计数器变量:
int i = 0; while (i < 10) { if (some_condition) ++i; else if (some_other_condition) { ... } else break; }
只需使用使代码可读且符合逻辑的代码。
在某些情况下,编译器(至少gcc)能够比执行相同操作的for循环优化得更好。 如果我没记错的话,优化只有几个时钟周期,所以它可能永远不会对性能产生任何明显的影响。
你不能写while(int i=0, i < n)
; 也就是说,你要在while
循环之前定义i
; 意味着i
存在于循环的内部和外部。
但是,在for
循环的情况下,你可以在for
循环本身中定义i
; 所以i
不存在于循环之外。 这是一个区别。 正因为这种差异,我喜欢不止while
。 并且很少使用,何时使事情变得更加繁琐!
有一些非常微妙的差异..
- 循环变量的范围,例如,使用
for
循环i
有本地范围,有一段while
必须先定义(这意味着它可用之后,当然你也可以用它来做…) -
continue
,使用for
循环,变量将递增/递减,有一段while
,您必须在continue
之前插入操作
坦率地说,如果你需要递增/递减, for
循环是有意义的,如果你不知道边界,并且没有实际的递增/递减, while
循环更有意义,例如
while(some_stream >> input) { // do stuff... }
绝不会以它的工作方式影响您的程序! 这是易于理解的问题。
switch(i) // Once finding your case, you can easily know where the switch ends // and thus the next statement of execution { case 1: break ; case 2: break ; // ..... case 10: break ; default:break ; } if( i==1 ) // Here you have the pain of finding where the last else if ends ! {} else if( i==2) {} // ... else if( i==10) {}
然而,这是一个品味问题。 我更喜欢switch
。