Recursion 为什么这个递归Pascal过程没有被捕获在一个无限循环中?

Recursion 为什么这个递归Pascal过程没有被捕获在一个无限循环中?,recursion,infinite-loop,pascal,Recursion,Infinite Loop,Pascal,我想知道为什么下面的递归Pascal过程实际上会终止: procedure reverseWordRecursive; var word : char; begin read(word); if word = '.' then writeln else begin reverseWordRecursive; write(word) end; end; {reverseWordRecursive} 该过程的行为可能与代码所建

我想知道为什么下面的递归Pascal过程实际上会终止:

procedure reverseWordRecursive;

  var
  word : char;

begin
  read(word);
  if word = '.' then
    writeln
  else
    begin
      reverseWordRecursive;
      write(word)
    end;
end; {reverseWordRecursive}
该过程的行为可能与代码所建议的有所不同。运行代码时,
read(word)
的调用仅在过程开始时运行一次。在每次递归调用开始时,不会要求用户输入一个
char
,而是输入
char
的整个
字符串

为什么它在“read(word)”调用中没有陷入无限循环?它不应该要求用户永远输入一个单词吗

过程如何知道在每次递归调用中实际使用相应的下一个字符?

当用于读取标准输入时,
Read()
过程将所有键入的字符存储到一个缓冲区中,包括终止CR/LF(Enter)的条目

Read()
返回的值取决于传递给
Read()
的参数类型。例如,如果参数是字符串,则返回除终止CR/LF之外的所有字符(
ReadLn()
也将返回CR/LF)。如果变量是
Char
,则返回一个字符,其余输入的字符保留在缓冲区中,以后可以通过再次调用
read()
来读取

因此,在您的代码中,读取过程将标准输入读取到缓冲区中,直到按下Enter键

假设您输入A、B、C和。然后是回车

此时,由于参数是a
char
字符,因此第一个输入的字符“a”将返回到代码中

将计算char,如果不是“.”,则递归调用该过程。现在,输入缓冲区中有字符,因此从缓冲区中读取下一个字符“B”。“C”也是一样,最后是“.”


这将终止递归调用,并开始展开堆栈,这是按C、B和A的相反顺序进行的。

当Pascal程序从标准输入流读取时,它们通常不会一次读取单个字符,而是读取一行字符并存储在缓冲区中,并从该缓冲区读取字符。这种缓冲在幕后自动发生

这就是为什么下面的程序

program example(input);
var
   c : char;
begin
   writeln('Reading a character');
   read(c);
   writeln('The character read was ', c);
end.

将等待您输入一行字符,即使它只读取一个。

它将不断递归,直到输入为
。抱歉,我没有澄清该过程的奇怪行为。我现在编辑了它。汤姆回答了。谢谢你,谢谢你。我现在明白了。这是我第一次看到这种怪癖