Сфера действия цикла - PullRequest
       3

Сфера действия цикла

9 голосов
/ 09 ноября 2011

В Java тело цикла do-while и условие цикла не принадлежат одной и той же области видимости. Поэтому следующий код не будет компилироваться:

do {
    boolean b = false;
} while (b); // b cannot be resolved to a variable

Но этот код имеет смысл для меня.

Кроме того, я не могу найти никаких подводных камней, если тело и состояние находятся в одной и той же области видимости; поскольку тело всегда будет выполняться, а в Java нет Goto, я не знаю, как можно пропустить объявление переменной в самой внешней области видимости do-while тела. Даже если это возможно, компилятор всегда может обнаружить такую ​​возможность и затем выдавать ошибки времени компиляции.

Есть ли какая-либо причина для такого поведения (кроме сохранения цикла do-while в том же формате, что и while)? Мне действительно любопытно. Спасибо за любые комментарии!

Ответы [ 8 ]

10 голосов
/ 09 ноября 2011

Следуя вашей логике, в данном случае случай, когда b не будет определен до первого использования:

do {
    continue;
    boolean b = false;
} while (b); // b cannot be resolved to a variable

Обратите внимание, что очень часто boolean флаги представляют собой небольшой код, поэтому старайтесь избегать ихчем бороться с ними.

10 голосов
/ 09 ноября 2011

Потому что именно так область видимости определяется в Java;внутри {} - новая область.

ИМО, не имеет особого смысла выделять отдельный случай для одной конструкции.

2 голосов
/ 09 ноября 2011

В вашем примере логическая переменная b находится в теле цикла do..while. Поскольку условная проверка выполняется вне тела, переменная находится вне области видимости. Правильная конструкция будет:

boolean b = false ; // Or whichever initial value you want
do {
    b = false;
} while (b);
1 голос
/ 09 ноября 2011

Вы можете написать что-то вроде этого, если хотите выйти из блока do-while, когда логическое значение определено внутри блока do-while.

do{
  boolean b;
  ...
  if(b){
    break;
  }
}while(otherCondition)  //or while(true)
1 голос
/ 09 ноября 2011
do {
    boolean b = false;
}
while (b);

Поскольку логическая переменная b является локальной переменной, имеющей область видимости только в пределах блока .

Из JLS :

Каждый оператор объявления локальной переменной немедленно содержится в блоке.

0 голосов
/ 24 мая 2016
public class DoWhileLoopExample {

    public static void main(String[] args) {

        int i=1;
        do {
            System.out.println("Do While Loop Example");

        } while(i<1);
    }
}
0 голосов
/ 09 ноября 2011

Определение оператора и ваша переменная не видны вне вашего блока операторов {}, поэтому компилятор жалуется.

Разница между while и do ... while заключается в том, что do ... while гарантированно выполняется хотя бы один раз, и это более простой способ записи в соответствии с JLS

Что касается области видимости переменной, она должна быть видимой, согласно этим правилам , иначе вы получите ошибку времени компиляции.

0 голосов
/ 09 ноября 2011

Это основные правила видимости. Переменные, объявленные внутри набора фигурных скобок {}, выходят из области видимости в конце фигурных скобок. Это противоречит стандартным правилам области видимости, и компилятору потребовалось бы обнаружить такой случай.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...