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

2022-09-01 22:40:43

这是我和我的老师之间长期争论的。是否存在绝对不能使用循环代替 /- 循环的情况?换句话说,是否存在一种特定情况,其中-循环将不能代替循环工作;是 /- 以任何方式与 ?forwhiledowhileforwhilewhiledowhilefor


答案 1

不,没有这种情况。每个 - 循环都可以写成 -循环(通过在循环之前执行一次正文),反之亦然。反过来,每个 -循环dowhilewhilewhile

while (X) {
    ...
}

可以写成

for (; X;) {
    ...
}

即,我们省略初始化和增量语句。我们还可以通过正确放置初始化和增量从 a 转换为 a。forwhile

简而言之,始终可以从一个循环变体转换为其他两个循环变体中的任何一个。-循环只是给你一个好处,能够限制循环控制变量的范围,并在顶部做任何增量。不言而喻,在许多情况下,一个特定的循环变体比其他变体更有意义。每个都有其特定的用例。for

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


[I]的 /- 以任何方式与 ?whiledowhilefor

事实并非如此。例如,以下两个片段的字节码是相同的:

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 循环,并且它们可能与其他循环类型有本质的不同。这绝对不是真的。-每个循环都是围绕迭代器(或数组循环)的纯语法糖。每个 -each 循环也可以转换为其他每个循环类型。下面是一个示例:forfor

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

答案 2

不可以,您始终可以将 for 循环重写为 while 循环,而任何 while 都可以将 for 循环重写为 for 循环。

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

等效于:

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