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




while for do while java (4)

其他答案已经涵盖了while循环和for循环之间的等价。 那是,

while(<expr>) {
  <body>
}

相当于

for(;<expr>;) {
}

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

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

在功能上等同于

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

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


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

while (X) {
    ...
}

可写成

for (; X;) {
    ...
}

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

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

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

[I] s / while - while以任何方式“与众不同”?

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

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 -each循环是围绕迭代器的纯语法糖(或循环遍历数组)。 每个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中循环测试也需要一个非常复杂的“for”条件。 这使得一个回到布尔绝对值:条件必须评估true或false。

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

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


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

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

相当于:

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






do-while