是否有必须使用while / do-while而不是for?的情况?

时间:2013-10-09 17:22:20

标签: java for-loop while-loop do-while

这是我和老师之间长期争论的焦点。可能会出现for循环绝对不能代替while / do - while循环的情况吗?换句话说,是否存在for - 循环不能代替while循环的特定情况; while / do - whilefor“有什么不同”?

4 个答案:

答案 0 :(得分:37)

不,没有这种情况。每个do - while循环都可以用while - 循环(通过在循环之前执行一次主体)来编写,反之亦然。反过来,每while - 循环

while (X) {
    ...
}

可以写成

for (; X;) {
    ...
}

即。我们省略了初始化和增量语句。我们也可以通过正确放置初始化和增量,从for转换回while

简而言之,它总是可以从一个循环变体转换为另外两个循环变体。 for - 循环只是为了让您能够限制循环控制变量的范围并在顶部进行任何增量。不言而喻,在许多情况下,一个特定的循环变体使用比其他变量更有意义;每个都有其特定的用例。

还要注意,乐趣并不仅仅以循环结束:它也可以将每个循环转换为递归函数,反之亦然(尽管在实践中可能存在限制;例如a工作正常的循环,当转换为递归函数时,会产生堆栈溢出错误。)


  

[我] while / do - while以任何方式" distinct"来自for

不是。例如,以下两个片段的字节码是相同的:

int x = 0;
while (x < 10) {
    x++;
}

int x = 0;
for (; x < 10;) {  // or: for (; x < 10; x++) {}
    x++;
}

都变为:

   0: iconst_0      
   1: istore_1      
   2: goto          8
   5: iinc          1, 1
   8: iload_1       
   9: bipush        10
  11: if_icmplt     5
  14: return 

关于for-each循环的评论中有谈话,并且它们可能与其他循环类型本质上不同。这绝对不是真的; for - 每个循环都是围绕迭代器的纯语法糖(或循环遍历数组)。每个for - 每个循环也可以转换为每个其他循环类型。这是一个例子:

for (String s : l) {  // l is a list of strings
    System.out.println(s);
}

String s;
Iterator<String> iter = l.iterator();  // l is a list of strings
while (iter.hasNext()) {
    s = iter.next();
    System.out.println(s);
}

都变为:

  24: invokeinterface #33,  1           // InterfaceMethod java/util/List.iterator:()Ljava/util/Iterator;
  29: astore_3      
  30: goto          50
  33: aload_3       
  34: invokeinterface #39,  1           // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
  39: checkcast     #19                 // class java/lang/String
  42: astore_2      
  43: getstatic     #45                 // Field java/lang/System.out:Ljava/io/PrintStream;
  46: aload_2       
  47: invokevirtual #51                 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
  50: aload_3       
  51: invokeinterface #57,  1           // InterfaceMethod java/util/Iterator.hasNext:()Z
  56: ifne          33

答案 1 :(得分:6)

不,你总是可以将for循环重写为while循环,并且看起来像for循环。

<init>
while (condition) {
...
<increment>
}

相当于:

for (<init>; <condition>; <increment>) {
...
}

答案 2 :(得分:2)

其他答案已经涵盖了while循环和for循环之间的等价关系。也就是说,

while(<expr>) {
  <body>
}

相当于

for(;<expr>;) {
}

请注意,使用do - while循环可以进行类似的缩减。任何do - while循环

do {
  <body>
} while(<expr>);

在功能上等同于

for (boolean firstIter = true; firstIter || <expr>; firstIter = false) {
  <body>
}

答案 3 :(得分:0)

“绝对”?我会说不。 然而在Java中使用do-while循环测试将需要一个非常复杂的“for”条件。这使得一个回到布尔绝对值:条件必须评估真或假。

因此,虽然我无法设想编译器无法被操作以执行正确逻辑的情况,但我可以在非常短的时间内看到维护程序的任何人可能都希望你被扔石头(或者可能认为你已经是)。 / p>

在相关的说明中,您无法用Java在机器语言中完成任何操作。但是有很多很多很好的理由不使用机器语言。当你试图让“可爱”编写代码时,大多数都同样适用。这一切都很有趣和游戏,直到你在0300与愤怒的客户打电话,或者你的老板,或两者兼而有之。