Вопрос

какое поведение я могу ожидать при запуске этого кода:

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);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top