8

当我运行此代码时,我可以期待什么行为:

do while(testA) {

    // do stuff

} while(testB);

它的行为会像:

do {
    while(testA) {
        // do stuff
    }    
} while(testB);

或者:

if(testA) {
    do {
        // do stuff
    } while(testA && testB);
}

还是完全出乎意料的事情?

我问这个问题是因为我认为这很模棱两可,对于其他搜索这个主题的人来说,并不是因为我懒得测试它。

4

6 回答 6

7

它相当于你的第一个块:

do {
    while(testA) {
        // do stuff
    }    
} while(testB);

解析 this 时Java 语法的相关部分是:

DoStatement:
    do Statement while ( Expression ) ;

Statement:
    WhileStatement

WhileStatement:
    while ( Expression ) Statement

Statement:
    Block

Block:
    { BlockStatements_opt }

您可以看到 Java 编译器会将其解析为do <WhileStatement> while ( Expression ) ;. 这是解析您编写的代码的唯一有效方法。

请记住,它没有任何特殊规则来解析此构造。由于 do-while 循环的编写方式不寻常,它最终只会让人类阅读感到困惑。在正常使用中,do-while 总是写成do { ... } while带有显式花括号。

于 2010-03-12T17:37:25.477 回答
3

它确实有效,但行为取决于您正在测试的条件。例如这段代码:

  int i = 2;
  int j = 4;
  do while(j > 0) {
       i--; j--;
       System.out.println("i:" + i + " j:" + j);
 } while(i > 0);

输出:

i:1 j:3
i:0 j:2
i:-1 j:1
i:-2 j:0

所以它的工作方式如下:

while(j>0) {

}

而通过交换变量名:

do while(i > 0) {
    //.. same as above
 } while(j > 0);

输出是:

i:1 j:3
i:0 j:2

看起来它的行为与第一种情况相同(即考虑第一个 while),但在这里,应用程序没有终止!


总结:
不满足不满足testA的时候,代码就像一个正常的循环一样工作。但是:如果在不再满足时仍然满足,则不再执行循环并且脚本没有终止。这仅适用于需要在循环内部更改“外部”循环的条件时。testBwhile(testA){}
testAtestB

更新: 在阅读其他答案后,我意识到这正是嵌套循环do-while的行为。 无论如何,吸取的教训:不要使用这种语法,因为它会让你感到困惑;)while

于 2010-03-12T17:41:16.497 回答
1

答案是#1。只要testB满足,它将继续循环,但如果不满足,它将不会执行代码testA

于 2010-03-12T17:29:00.540 回答
1

" do {} while();" 是一种构造,而 " while(){}" 是另一种构造。

没有“ do while”之类的东西;您无意中嵌套了它们并利用了 {} 对于单个指令是可选的这一事实。

换句话说,这是合法的语法:

do System.out.println("Hello World") while (true);

和 inif语句一样,块被视为单个语句。

也就是说,您的第一个可能答案是正确的,其中“ ”是外部“ ”while(){}内的单个非括号内容do {} while();

于 2010-03-12T17:30:41.163 回答
1

它的行为就像

do {
    while(testA) { 
        // stuff
    }
} while(testB);

因此,该代码块以这种方式解析:

在 testB 为真时执行 {a block of code}。其中 {a block of code} 是内部 while。

写这样的代码肯定有点不常见:)

于 2010-03-12T17:36:11.033 回答
0

我不认为这个代码是合法的。

do while(testA) {

        // do stuff

    } while(testB);
于 2010-03-12T17:36:14.547 回答