carriage return / 使用 do-while 循环移除换行符

carriage return / line feed removal with do-while loop

各位,

我使用了google和这个网站,但是找不到下面代码中一小部分的深入解释:

// Guess the letter game, 4th version.
class Guess4 {
 public static void main(String args[])
 throws java.io.IOException {
  char ch, answer = 'K';

do {
 System.out.println("I'm thinking of a letter between A and Z.");
 System.out.print("Can you guess it: ");
 // read a letter, but skip cr/lf
 do {
  ch = (char) System.in.read(); // get a char
 } while(ch == '\n' | ch == '\r');

if(ch == answer) System.out.println("** Right **");
else {
 System.out.print("...Sorry, you're ");
 if(ch < answer) System.out.println("too low");
 else System.out.println("too high");
 System.out.println("Try again!\n");
   }
  } while(answer != ch);
 }
}  

所以我的问题是关于这部分的:

do {ch = (char) System.in.read(); 
} while(ch == '\n' | ch == '\r');

有人可以深入解释一下这是如何工作的吗?我知道它首先从键盘读取一个字符,因为 do-while 循环至少运行一次。 |意味着它们都必须为假才能让 do-while 循环停止。这按什么顺序工作?所以当我按下一个字母时,它首先得到一个回车符 return 和换行符,两者都是正确的,所以它再次运行 system.in.read,但随后它运行了两次并且它也已经有了我的字母,所以当 system.in.read 由于循环再次运行时,它会再次产生一个回车符 return 和换行符,或者不?所以在我看来它变成了一个无限循环,但事实并非如此。我尝试了 运行 没有这个的程序,当我按下一个字母时,它打印了两个问题,两次。为什么?我对这个循环和删除这个 cr/nl 的工作原理有点困惑。感谢您的帮助。

ch = (char)System.in.read(); 在循环的每次迭代中将新的 char 读入 ch。只要输入字符是换行符 (\n) 或换行符 (\r),循环就会继续。任何其他输入结束循环。