Java - 根据条件转回for循环计数器

时间:2012-01-26 00:01:27

标签: java if-statement for-loop

以下是我大学任务代码的一部分。

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 个答案:

答案 0 :(得分:10)

虽然它在Java中并不严格违法,但在循环中更改for循环控制变量的值并不是一个好主意。 (这种修改 在其他一些语言中是非法的。)

通过更改循环中的循环迭代变量,您将搞乱使用for循环提供的隐式假设。例如,如果读者看到:

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

读者将正确地假设循环准确执行10次(或者,如果其中有break则不超过10次)。但是,如果您在循环中更改i的值,则此假设不再有效。

如果必须更改计数器的值,我建议将其写为while循环:

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

以及解释为什么要在循环中更改i以及这样做意味着什么的注释。

答案 1 :(得分:3)

这是非常糟糕的做法。将for循环更改为while循环,仅在

时递增
 codeList.contains(userCode)==true or userQuantity[i]!=0. 

答案 2 :(得分:1)

  

为了避免混淆,我应该解释这是一个无限的for循环(带有break语句)。我做for循环的原因是因为我需要。是因为我的for循环条件不起作用还是我做了一些完全错误的事情?

我有一种感觉,你误解了要求(例如,你不是必需使用for循环),或者你的想法存在错误;即,有一个更简单的解决方案,不涉及计数器倒退。

(令人惊讶的是,编程练习需要您编写大多数有经验的Java程序员都认为是错误代码的代码。简单的解释是它不是。)

无论哪种方式:

  • 由于Greg描述的原因,在for循环中更改循环变量是不好的做法。

  • “无限循环”的想法真的很奇怪。以下是合法的Java ...

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

    但写作的惯用方法是:

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

    ...在大多数情况下,这意味着你根本不需要让变量倒退。