Java - возврат счетчика цикла for на основе условного - PullRequest
2 голосов
/ 26 января 2012

Ниже приведена часть кода для моего задания в колледже.

else if (!codeList.contains(userCode)) {
                    i--; // i is the counter for the for-loop
                }
else if (userQuantity[i]==0) {
                    i--;
                }

Первая часть гарантирует, что, если пользователь вводит неправильный код, счетчик i не увеличивается на 1, или, скорее, вычитает 1 из недавно увеличенного счетчика. Эта часть отлично работает.

Однако вторая часть - это то, с чем у меня проблемы. userQuantity [] является массивом int, и он должен быть массивом. Это, похоже, ничего не делает с кодом. Даже если для количества введено 0, оно все равно увеличивает счетчик, который нежелателен.

Я должен объяснить, чтобы избежать путаницы, что это бесконечный цикл for (с оператором break). Причина, по которой я делаю цикл for, заключается в том, что я обязан. Это из-за моего цикла for, что условие не работает, или я делаю с ним что-то не так?

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

Ответы [ 3 ]

10 голосов
/ 26 января 2012

Хотя это не является строго недопустимым в Java, не рекомендуется менять значение переменной управления цикла for внутри цикла.(Такое изменение является недопустимым в некоторых других языках.)

Изменяя переменную итерации цикла в цикле, вы теряете неявные предположения, предлагаемые при использовании forпетля.Например, если читатель видит:

for (int i = 0; i < 10; i++) {
    // ...
}

, читатель по праву предположит, что цикл предназначен для выполнения ровно 10 раз (или не более 10, если в нем есть break).Однако если вы измените значение i в цикле, это предположение больше не действует.

Если вы должны изменить значение счетчика, я бы предложил написать этов виде while цикла вместо:

int i = 0;
while (i < 10) {
    // ...
    i++;
}

вместе с комментарием, объясняющим, почему вы изменяете i внутри цикла и что это значит делать.

3 голосов
/ 26 января 2012

Это очень плохая практика. Измените цикл for на цикл while и увеличивайте его, только если

 codeList.contains(userCode)==true or userQuantity[i]!=0. 
1 голос
/ 26 января 2012

Я должен объяснить, чтобы избежать путаницы, что это бесконечный цикл for (с оператором break).Причина, по которой я делаю цикл for, заключается в том, что я обязан.Это из-за моего цикла for, что условие не работает, или я делаю с ним что-то не так?

У меня такое ощущение, что вы неправильно понимаете требования (например, вы не требуется , чтобы использовать for цикл), или что в вашем мышлении есть ошибка;то есть есть более простое решение, которое не включает счетчик, идущий назад.

(Удивительно, что программирование потребовало бы от вас написания кода, который, по мнению большинства опытных Java-программистов, является плохим кодом. Простое объяснение состоит в том, что это не так.)

В любом случае:

  • Изменение переменной цикла в цикле for является плохой практикой по причинам, описанным Грегом.

  • Идея "бесконечный цикл "действительно странно.Следующее является допустимым Java ...

    for (int i = 0; true; i++) {
        ...
    }
    

    , но идиоматический способ написать это:

    int i = 0;
    while (true) {
        ...
        i++; // ... at the appropriate point / points
    }
    

    ... что в большинстве случаев означает, что вам не нужнозаставить переменную идти назад.

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