Java делает в то время как, в то время как

что поведение может я ожидать, когда я выполняю этот код:

do while(testA) {

    // do stuff

} while(testB);

Будет это вести себя как:

do {
    while(testA) {
        // do stuff
    }    
} while(testB);

Или:

if(testA) {
    do {
        // do stuff
    } while(testA && testB);
}

Или что-то полностью неожиданное?

Я задаю этот вопрос, потому что я думаю, что это довольно неоднозначно, и для других людей, ищущих по этой теме, не потому что я ленив для проверения его.

8
задан L0j1k 11 June 2014 в 17:13
поделиться

6 ответов

Это эквивалентно вашему первому блоку:

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 while ( Expression ) ;. Это единственный правильный способ разобрать код, который вы написали.

Имейте в виду, что нет никакого специального правила для разбора этой конструкции. Она просто оказывается запутанной для человека из-за необычного способа написания цикла do-while. При обычном использовании do-while всегда записывается как do { ... } while с явными фигурными скобками.

7
ответ дан 5 December 2019 в 12:57
поделиться

Это действительно работает, но поведение зависит от того, какие условия вы тестируете. Например. этот код:

  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 .
В любом случае, урок усвоен: не используйте такой синтаксис, потому что он может вас запутать;)

3
ответ дан 5 December 2019 в 12:57
поделиться

Он ведет себя как

do {
    while(testA) { 
        // stuff
    }
} while(testB);

Итак, этот блок кода анализируется следующим образом:

do {блок кода}, пока testB истинен. Где {блок кода} - это внутреннее while.

Конечно, писать такой код немного необычно :)

1
ответ дан 5 December 2019 в 12:57
поделиться

Ответ - №1. Он будет продолжать цикл до тех пор, пока testB удовлетворяется, но не выполнит код, если testA не удовлетворяется.

1
ответ дан 5 December 2019 в 12:57
поделиться

"do {} while();" - это одна конструкция, а "while(){}" - другая.

Не существует такого понятия, как "do while"; вы непреднамеренно вложили их и воспользовались тем, что {} необязателен для одиночных инструкций.

Другими словами, это законный синтаксис:

do System.out.println("Hello World") while (true);

И как в if-заявлениях, блок рассматривается как одно заявление.

То есть, ваш первый возможный ответ правильный, где "while(){}" - это единственная вещь без скобок внутри внешнего "do {} while();"

.
1
ответ дан 5 December 2019 в 12:57
поделиться

Я не думаю, что этот код является законным.

do while(testA) {

        // do stuff

    } while(testB);
0
ответ дан 5 December 2019 в 12:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: