Java делать пока, пока
Вопрос
какое поведение я могу ожидать при запуске этого кода:
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 <WhileStatement> while ( Expression ) ;
.Это единственный правильный способ проанализировать написанный вами код.
Имейте в виду, что для анализа этой конструкции не существует какого-либо специального правила.Человеку просто становится сложнее читать из-за необычного способа написания цикла 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 имеет значение true.Где {блок кода} — это внутренний while.
Конечно, писать такой код немного необычно :)
Ответ №1.Он будет продолжать цикл до тех пор, пока testB
удовлетворен, но он не выполнит код, если testA
не удовлетворен.
"do {} while();
" это одна конструкция, а "while(){}
" Другой.
Нет такого понятия, как "do while
";вы непреднамеренно вкладываете их и пользуетесь тем фактом, что {} не является обязательным для отдельных инструкций.
Другими словами, это правильный синтаксис:
do System.out.println("Hello World") while (true);
И как в if
-statements, блок рассматривается как один оператор.
То есть ваш первый возможный ответ — правильный, где «while(){}
" это единственный объект без квадратных скобок внутри внешнего "do {} while();
"
Я не думаю, что этот кодекс является законным.
do while(testA) {
// do stuff
} while(testB);