循环和一半VS重复直到哨兵成语

时间:2014-10-26 06:48:56

标签: java computer-science

在大学时,我们学习了两种从控制台读取整数的方法,而没有给出特定的整数。 第一个是“循环和一半”:

int val = readInt(“Enter val:”);
while (val != SENTINEL) 
    val = readInt(“Enter val:”);
}

他们说由于代码重复val = readInt(“Enter val:”);这是一种糟糕的方式 他们建议采用第二种方式“重复直到哨兵成语”:

  while (true) {
       value = readInt(“Enter val:”);
       if (value == sentinel) break;
    }

我有老师,他更喜欢计算机科学,他总是很伤心,最好避免在课程中while(true)break,除非是紧急情况,否则不要使用它们,所以我现在很困惑。 哪种方式被认为是更好的解决方案?

2 个答案:

答案 0 :(得分:1)

第三种解决方案怎么样?

boolean keepReading = true;
while (keepReading) {
    int val = readInt("Enter val");
    if (val == SENTINEL) {
        keepReading = false;
    } 
    else {
        // process the value
    }
}

它与第二个类似,但不使用while(true)break。我真的不喜欢第一个,因为要完成它,你还必须重复对哨兵的检查:

int val = readInt(“Enter val:”);
while (val != SENTINEL) 
    val = readInt(“Enter val:”); // duplication
    if (val != SENTINEL) { // duplication
        // process the value 
    }
}

答案 1 :(得分:1)

是的,你所说的" Loop和half"是有一些代码重复。你打电话给#34; Repeat-Until-Sentinel"成语while(true)并不能很好地表达你的意图。有关其他说明,请参阅Are “while(true)” loops so bad?

在您的示例中,您可以执行

int value;
while ((value = readInt()) != SENTINEL) {
    System.out.println(value);
}

在java中,当你有一个赋值操作时,会返回结果,所以你可以比较它而不重复你的代码。

重要的一点是,它更能表达意图:你可以把它读作而读取的值不是哨兵