что поведение может я ожидать, когда я выполняю этот код:
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);
Соответствующие части грамматики Java при разборе этого:
DoStatement:
do Statement while ( Expression ) ;
Statement:
WhileStatement
WhileStatement:
while ( Expression ) Statement
Statement:
Block
Block:
{ BlockStatements_opt }
Вы видите, что компилятор Java разберет это как do
. Это единственный правильный способ разобрать код, который вы написали.
Имейте в виду, что нет никакого специального правила для разбора этой конструкции. Она просто оказывается запутанной для человека из-за необычного способа написания цикла do-while. При обычном использовании 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
Похоже, что он ведет себя так же, как и в первом случае (т.е. первый while считается), но здесь, приложение не завершается!
Резюме:
В то время, когда testA
больше не выполняется и testB
также не выполняется , код работает как обычный цикл while (testA) {}
.
Но: Если в то время, когда testA
больше не выполняется , testB
все еще выполняется , цикл будет больше не выполняется, и сценарий не завершается . Это применимо только в том случае, если необходимо изменить условие «внешнего» цикла внутри цикла.
Обновление:
И после прочтения другого ответа я понимаю, что это в точности поведение вложенного цикла do-while
- while
.
В любом случае, урок усвоен: не используйте такой синтаксис, потому что он может вас запутать;)
Он ведет себя как
do {
while(testA) {
// stuff
}
} while(testB);
Итак, этот блок кода анализируется следующим образом:
do {блок кода}, пока testB истинен. Где {блок кода} - это внутреннее while.
Конечно, писать такой код немного необычно :)
Ответ - №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);