gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 20:32:36 25 4
gpt4 key购买 nike

这是我和老师之间的长期争论。会不会有一个for循环绝对不能用来代替while/do - while环形?换句话说,是否存在 for 的特定情况? -loop 不能代替 while环形;是 while/do - while以任何方式与for“不同” ?

最佳答案

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

while (X) {
...
}

可以写成

for (; X;) {
...
}

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

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

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


[I]s while/do-while in any way "distinct" from 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-each 循环也可以转换为其他每个循环类型。这是一个例子:

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

关于java - 是否存在必须使用 while/do-while 而不是 for 的情况?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19278675/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com