2010-03-12 2 views
8

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

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

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

Или:

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

Или что-то совершенно неожиданным?

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

+12

Поведение, которое вы должны ожидать, состоит в том, что сотрудник поражает вас палкой. – voyager

+0

@voyager К счастью, у меня нет коллег, которых нужно следить; спасибо за совет, хотя! – Pindatjuh

ответ

6

Это эквивалентно первого блока:

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

соответствующих частей на Java grammar при разборе этого:

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 с явными фигурными фигурными скобками.

1

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

+0

Это юридический синтаксис (JDK 1.6). Так почему же тогда это должен быть незаконный код? Пожалуйста, объясни. – Pindatjuh

+0

Вы правы, я протестировал его, и ответ №1. Я отредактировал свой ответ. –

1

«do {} while();» - это одна конструкция, а «while(){}» - это еще одна.

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

Другими словами, это юридический синтаксис:

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

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

Который должен сказать, ваш первый возможный ответ является правильным, где «while(){}» является единственным, не заключенный в скобки, что внутри внешняя «do {} while();»

1

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

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

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

do {блок кода}, в то время как testB является истинным. Где {блок кода} является внутренним.

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

0

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

do while(testA) { 

     // do stuff 

    } while(testB); 
+0

Это так. Попробуй и посмотри. –

3

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

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 

Похоже, он ведет себя так же, как и в первом случае (т.е. первый пока рассматривается), но здесь приложение не заканчивается!


Резюме:
В то время, когда testA является не удовлетворены больше и testB также не удовлетворены, код работает как обычный while(testA){} цикла.
Но: Если, в то время, когда testA является больше не удовлетворены, testBпо-прежнему выполняется, петля не выполняется больше и сценарий не завершение. Это применимо только в том случае, если условие «внешнего» цикла необходимо изменить внутри цикла.

Update: И после прочтения другого ответа, я понимаю, что это именно то поведение вложенной do-while - while петли.
В любом случае, извлеченный урок: не используйте этот синтаксис, потому что он может вас смутить;)

+0

Это не завершение, потому что, как только я достиг 0, внутренний цикл больше не запускается - и поэтому j никогда не сможет достигнуть 0. –

+0

Интересно, это, очевидно, связано с тем, что цикл 'do while' будет замкнутым, но содержимое этого 'do while' не будет зацикливаться, потому что внутренний цикл не дает условия! Спасибо за тестирование. – Pindatjuh