是否存在必须使用 while/do-while 而不是 for 的情况?
2022-09-01 22:40:43
这是我和我的老师之间长期争论的。是否存在绝对不能使用循环代替 /- 循环的情况?换句话说,是否存在一种特定情况,其中-循环将不能代替循环工作;是 /- 以任何方式与 ?for
while
do
while
for
while
while
do
while
for
这是我和我的老师之间长期争论的。是否存在绝对不能使用循环代替 /- 循环的情况?换句话说,是否存在一种特定情况,其中-循环将不能代替循环工作;是 /- 以任何方式与 ?for
while
do
while
for
while
while
do
while
for
不,没有这种情况。每个 - 循环都可以写成 -循环(通过在循环之前执行一次正文),反之亦然。反过来,每个 -循环do
while
while
while
while (X) {
...
}
可以写成
for (; X;) {
...
}
即,我们省略初始化和增量语句。我们还可以通过正确放置初始化和增量从 a 转换为 a。for
while
简而言之,始终可以从一个循环变体转换为其他两个循环变体中的任何一个。-循环只是给你一个好处,能够限制循环控制变量的范围,并在顶部做任何增量。不言而喻,在许多情况下,一个特定的循环变体比其他变体更有意义。每个都有其特定的用例。for
还要注意,乐趣并不仅仅以循环结束:也可以将每个循环转换为递归函数,反之亦然(尽管在实践中可能存在限制;例如,工作良好的循环在转换为递归函数时可能会产生堆栈溢出错误)。
[I]的 /- 以任何方式与 ?
while
do
while
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
循环,并且它们可能与其他循环类型有本质的不同。这绝对不是真的。-每个循环都是围绕迭代器(或数组循环)的纯语法糖。每个 -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
不可以,您始终可以将 for 循环重写为 while 循环,而任何 while 都可以将 for 循环重写为 for 循环。
<init>
while (condition) {
...
<increment>
}
等效于:
for (<init>; <condition>; <increment>) {
...
}