为什么我可以使用 pascal 中的函数名作为变量名而不需要定义?

ava*_*sin 1 freepascal

我想知道docs 中描述的free pascal 函数中非常奇怪的行为。

据说,以下代码将成功编译/执行:

function Test : integer;
begin
  Test := 2;
end;

begin
  WriteLn(Test());
end.
Run Code Online (Sandbox Code Playgroud)

Test但是如果我在方程右侧使用函数名称,它将执行递归循环。

因此,pascal 函数从一方面来说,用变量的名称Test和函数返回值的类型来定义变量integer。从另一边,您仍然可以调用函数(使用其名称进行递归调用)。

为什么?!目标是什么?

Abe*_*sto 5

函数体内有一个特殊变量,其名称与函数名称相同。它用于保存函数结果。

它是在原始 Pascal 语法中引入的。后来为了防止出现不便,Result引入了另一个名为 name 的变量,它只是前一个变量的联盟:

Test := 2;
i := Result + 3; // Here i = 5; 
Run Code Online (Sandbox Code Playgroud)

所以,就目前而言,Test := 2;Result := 2;是一样的。

如果在等式右侧使用函数名称,它将被解释为变量,而不是函数调用:

Test := Test + 1; // Increments Test value
Run Code Online (Sandbox Code Playgroud)

但您仍然可以使用括号递归调用函数:

Test := Test() + 1; // Recursion
Run Code Online (Sandbox Code Playgroud)

因此,您可以通过三种方式从函数返回值(对于您的示例):

function Test : integer;
begin
    Test := 2; // Function result = 2
    Result := 2; // Same to previous
    Exit(2); // Sets function result to 2 end exits immediately
end;
Run Code Online (Sandbox Code Playgroud)

使用哪种方法取决于您。