以下是我大学任务代码的一部分。
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循环,条件不起作用还是我做了一些完全错误的事情?
这是我的大学任务所以我会很感激解释而不只是快速修复。如果您需要我解释,请告诉我。
答案 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
}
...在大多数情况下,这意味着你根本不需要让变量倒退。