我可以期待什么样的行为,当我运行这段代码:

do while(testA) {

    // do stuff

} while(testB);

它会像:

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

或者:

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

或者一些完全出乎预料?

我问这个问题,因为我认为这是相当模糊的,而对于其他人搜索这个主题,的的,因为我懒来测试它。

有帮助吗?

解决方案

它等同于第一个块:

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

爪哇语法的有关部分解析此时:

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

其他提示

它的工作原理的确,但行为取决于你要测试的条件。例如。此代码:

  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

它看起来像它的行为与在第一种情况下(即,第一,同时被认为是),但在这里,<强>应用并不终止!


<强>要点:结果 而此时testA的时间不满足再和testB也是不满足,代码工作像一个正常的while(testA){}循环。结果 但是:如果在当testA是时间的不再满足testB仍不满意,该循环的不可以执行任何更多的和脚本是的不终止即可。仅当需要在循环内要被改变的“外”循环的条件适用。

<强>更新 和阅读对方的回答后,我意识到,这正是嵌套do-while的行为 - while循环结果 总之,我们的教训:不要使用这种语法,因为它可以迷惑你;)

它的行为就像

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

所以,代码块被解析这样:

做{代码块}而TESTB是真实的。其中,{代码块}是内一段时间。

这当然有点罕见写这样的代码:)

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

do {} while();” 是一种构建体,而 “while(){}” 是另一个。

有作为“do while”没有这样的东西;您无意中嵌套他们并考虑的事实,即{}是可选的单一指令的优势。

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

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

和像if语句,块被当作单个语句。

这就是说,你的第一个可能的答案是正确的,其中“while(){}”是外“do {} while();

内的一个非括号的事情

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

do while(testA) {

        // do stuff

    } while(testB);
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top