题
我可以期待什么样的行为,当我运行这段代码:
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);