在大学时,我们学习了两种从控制台读取整数的方法,而没有给出特定的整数。 第一个是“循环和一半”:
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
,除非是紧急情况,否则不要使用它们,所以我现在很困惑。
哪种方式被认为是更好的解决方案?
答案 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中,当你有一个赋值操作时,会返回结果,所以你可以比较它而不重复你的代码。
重要的一点是,它更能表达意图:你可以把它读作而读取的值不是哨兵。