Циклическая логика (Java) - PullRequest
0 голосов
/ 26 ноября 2011

Это может показаться глупым, но я немного озадачен следующим кодом:

public class Loops{

public static void main(String[] args) {

    int i = 0;
    int j = 2;
    int k = 0;
    boolean continue = i<j;
    while (continue && k < 2) {
        i++;
        j--;
        k++;
    }
    System.out.println(j);
}

}

Эта программа печатает 0, но я просто не понимаю, почему она не печатает 1.как я вижу, после одного цикла i = j = 1.И таким образом продолжить = ложь.Так что, если кто-нибудь сможет объяснить мне логику, стоящую за этим, я буду очень признателен!

Ответы [ 5 ]

4 голосов
/ 26 ноября 2011

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

    while (i<j && k < 2) {
        i++;
        j--;
        k++;
    }
3 голосов
/ 26 ноября 2011

Ваш цикл будет оптимизирован компилятором следующим образом:

boolean continue = i<j;
while (true && k < 2)

и, наконец,

while (k < 2)

Так что для выхода из него необходимо выполнить цикл два раза

After the first loop: j == 1, k == 1 
After the second loop: j == 0, k == 2, exit now

вот почему, наконец, j == 0

Попробуйте поместить условие в while():

while (i<j && k < 2)
2 голосов
/ 26 ноября 2011

Продолжить устанавливается только вне тела цикла, оно никогда не обновляется во время цикла. Таким образом, continue устанавливается в значение true перед началом цикла, а затем никогда не изменяется снова.

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

Прежде всего, ваша переменная continue всегда оценивается как true (0 <2), поэтому мы можем ее игнорировать. </p>

Первая итерация:

  • iв конечном итоге оценивается в 1.
  • j в конечном итоге оценивается в 1.
  • k в конечном итоге оценивается в 1.
  • Как k < 2, мы делаем другоеИтерация.

Вторая итерация:

  • i в конечном итоге оценивается в 2.
  • j заканчивается в 0.
  • k в итоге оценивается как 2.
  • Когда k == 2, мы выходим из цикла.

Затем мы печатаем j, что дает 0.

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

Вы устанавливаете значение переменной 'k' только один раз и, следовательно, продолжаете также.Вам также необходимо переоценить условное выражение внутри цикла.

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

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