@replicate
нет такой силы, чтобы нас победила

Почему прирощение на единицу в цикле break ставиться в конце, а в цикле с continue в начале?

Имеется два кода
String players[] = {"David", "Daniel", "Anna", "Gregory"};
        int totalPlayers = players.length;
 int counter =0;
        while (counter< totalPlayers){
            if (counter == 3){
                break;
        }
            String thePlayer = players[counter];
            System.out.println("While-Break Congratulations, "+thePlayer+ "!");
            counter++;
        }

и
String players[] = {"David", "Daniel", "Anna", "Gregory"};
        int totalPlayers = players.length;
 int counter=0;
         while (counter < totalPlayers){
            counter++;
         String thePlayer = players[counter];
        if (thePlayer.equals("David")){
             continue;
         }
         System.out.println("While equals Congratulations, "+ thePlayer+ "!");
        }

Почему в первом отрывке кода операция counter++; идет в конце цикла, а во втором вначале?
  • Вопрос задан
  • 560 просмотров
Решения вопроса 2
@Shiftuia
Java-программист
Потому что код делает разные вещи.

В первом случае поздравления получат первые 3 человека, а потом break выбросит нас из цикла

Во второму случае инкрементируя counter мы проскакиваем "David" и поздравляем последних 3 человек, упав при этом в ArrayIndexOutOfBound из за того что сначала инкрементировали counter, а потом попытались взять элемент массива с индексом 4.
Ответ написан
mindtester
@mindtester
http://iczin.su/hexagram_48
исключительно игры разума, автора(ов) этих фрагметов фрагментов ("волюнтаризм!" (с) к.ф "Кавказская пленица")

так как в обоих случаях, цикл основан на счетчике, его гарантированно можно переписать на основе for, компактнее и более читаемо (понятно)

ps а еще, хорошо бы знать исходную цель? надо ли кого то пропускать? кого? зачем? почем?.. и тд

pps кстати, о креше второго фрагмента, перенос инкримента счетчика ((upd) в конец цикла ну или по меньшей мере после строки
String thePlayer = players[counter]; устраняет креш ;))
может посыл автора примера в этом?

ppps ну или вообще в си-стайл (постинкримент по месту использования) обдумайте, почему исходный пример (вариант 2) крешится? а предложенные правки - нет
String players[] = {"David", "Daniel", "Anna", "Gregory"};
        int totalPlayers = players.length;
 			int counter=0;
         while (counter < totalPlayers)
         {
         String thePlayer = players[counter++];
        if (thePlayer.equals("David")){
             continue;
         }
         System.out.println("While equals Congratulations, "+ thePlayer+ "!");
        }


в любом случае, расположение break, continue, и инкремента опорного счетчика цикла - исключительно на совести кодера

pppps конец мистики (мы говорим о втором фрагменте)
строка counter++; если расположена до String thePlayer = players[counter]; вызовет креш выхода за диапазон, так как while (counter < totalPlayers) условие проверил, но мы тут же его изменяем (инкремент)
counter должен быть использован после проверки на корректность, но изменен только после использования..
следите дальше:
counter должен быть изменен до выхода из данного круга цикла ((upd)по continue.. а break оборвет цикл.. в целом не плохие примеры задуматься/вспомнить, как что работает ))
то есть - если мы поместим его после continue цикл становится вечным ))
так что либо
String thePlayer = players[counter++];
либо
String thePlayer = players[counter];
counter++; // но обязательно сразу, строго после, и ни в коем случае не раньше
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы