为什么这个循环是坏做法?[已关闭]

2022-09-02 04:55:43

以下循环不是很好的做法。它是否是由于是循环的主要条件而不是变量,这意味着循环是无限的?另外,这是因为没有实例输入“end”来停止循环吗?Stringforintfor

Scanner in = new Scanner(System.in);
int i = 0;
for (String s = in.next(); !s.equals("end"); i++) 
{
    System.out.println("The value of i is: " + i + " and you entered " + s);
}

我该如何重写它,使它符合公认的风格?

(这是过去试卷中的一个问题。


答案 1

好吧,你的字符串永远不会改变,这可能会导致无限循环。您可能想要:s

for (String s = in.next(); !s.equals("end"); s = in.next(), i++) {
    ...
}

有些人(包括我)可能会说不应该在这个循环的增量部分,因为它与条件没有直接关系:i++

for (String s = in.next(); !s.equals("end"); s = in.next()) {
    ...
    i++;
}

这是因为字符串是 for 循环的主要条件而不是 int 变量,这意味着 for 循环是无限的吗?

原始循环确实是无限的(至少,在输入初始输入并假设不是第一个输入之后)。但是,这不是出于您陈述的原因。For循环通常使用积分循环控制变量编写,但情况并非总是如此。例如,循环访问链表的常见习语是:"end"

for (Node node = list.head; node != null; node = node.next) {
    ...
}

循环的问题在于字符串永远不会更改,因此除非这是第一个输入,否则它永远不会相等。s"end"


答案 2

我建议将循环条件和调用分开:Scannner.next()

while (in.hasNext()) {
    String s = in.next();
    if (s.equals("end")) {
      break;
    }
    System.out.println("The value of i is: " + i + " and you entered " + s);
    i++;
}

我认为这比试图把所有东西都压缩成一个表达要容易理解得多。for


推荐