Java同时做

Pin*_*juh 8 java loops ambiguity do-while

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

do while(testA) {

    // do stuff

} while(testB);
Run Code Online (Sandbox Code Playgroud)

它会表现得像:

do {
    while(testA) {
        // do stuff
    }    
} while(testB);
Run Code Online (Sandbox Code Playgroud)

要么:

if(testA) {
    do {
        // do stuff
    } while(testA && testB);
}
Run Code Online (Sandbox Code Playgroud)

还是完全出乎意料的?

我问这个问题是因为我觉得这个问题很模糊,对于其他人来说这个话题,并不是因为我懒得去测试它.

Joh*_*ica 7

它相当于你的第一个块:

do {
    while(testA) {
        // do stuff
    }    
} while(testB);
Run Code Online (Sandbox Code Playgroud)

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

DoStatement:
    do Statement while ( Expression ) ;

Statement:
    WhileStatement

WhileStatement:
    while ( Expression ) Statement

Statement:
    Block

Block:
    { BlockStatements_opt }
Run Code Online (Sandbox Code Playgroud)

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

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