9

在我的编程课原则中,我们谈论的是不同的调用方法。我们讨论的一些是:

  • 按值调用
  • 通过引用调用
  • 按值/结果调用
  • 点名

我找不到按名称调用如何工作的示例。有人愿意给我举个例子吗?我认为当您将 xml 文件作为输入时,这类似于按名称调用。有人能给我一个更传统的例子吗?

4

3 回答 3

9

我将使用一种假设的编程语言。假设我们有一个函数p(x)打印出 x 然后返回它。现在让我们定义一个函数:

function foo(x, y) { return y+1; }

现在让我们用一些参数来调用它:

foo(p(123),p(456))

x并且y将被替换为参数,因此对foo上面的调用将导致:

return p(456)+1;

所以我们要在屏幕上打印 456 并返回 457。在另一种评估策略中,我们将首先评估函数参数(在此过程中将 123 和 456 打印到屏幕上),然后y在函数体中替换 456,最终返回 457。

这是人为的,但我希望你能明白。这都是关于替代的。

于 2010-07-25T21:56:11.933 回答
3

http://en.wikipedia.org/wiki/Evaluation_strategy#Call_by_name

在按值调用中,您评估参数,检索然后传递给函数的值。 foo(bar())被评估为arg = bar();,然后调用 foo(arg) ,并且在函数体中,这个新分配的 arg 变量是可访问的、可修改的,...

在按名称调用中,您在函数体中用调用期间使用的代码替换对参数的任何引用。然后,评估主体,您将评估论点。 foo(bar())withfoo(arg) { return arg; }将被评估为foo(arg) { return bar(); }

于 2010-07-25T21:57:14.660 回答
1

当实际参数为scaler时,按名称调用作为按引用调用,但当实际参数为表达式或数组时则不同,然后在每次访问时重新评估实际参数。

这是一个简单的例子

begin
    integer n;
    procedure p(k: integer);
        begin
        print(k);
        n := n+1;
        print(k);
        end;
    n := 0;
    p(n+10);
    end;
  • 按值调用输出 => 10 10
  • 按名称调用输出 => 10 11
于 2013-05-15T11:40:48.017 回答