通过名称传递变量的评估

时间:2019-11-23 13:24:42

标签: parameters parameter-passing programming-languages pass-by-name

我正在学习参数传递。

我一直在研究有关参数传递的问题,但我不理解一个问题。

我搜索了Internet,但没有显示参数为表达式的例子。

如果是表达式,我可以知道如何评估通行证吗?

问题如下。

function func(int a, int b, int c)
  begin
    a := b + c;
    b := c + 1; 
    print a, b, c;
 end
function main
  begin
    int x := 10; 
    int y := 5; 
    ink z := 15;
    func(x, y, y + z);
    print x, y, z;
  end

1 个答案:

答案 0 :(得分:0)

来自Wikipedia :(请注意,“按名称呼叫”和“按名称传递”是相同的意思。)

  

按名称调用是一种评估策略,其中在调用函数之前不评估函数的参数,而是将其直接替换为函数主体(使用捕获避免替换),然后在每次使用它们时对其进行赋值出现在功能中。如果函数主体中未使用参数,则永远不会对参数求值;如果多次使用,每次出现时都会重新评估。

因此,对于您的功能,我们应该相应地替换a → xb → yc → y + z

  begin
    x := y + (y + z);
    y := (y + z) + 1; 
    print x, y, (y + z);
  end

我在替换c的地方加上了方括号,以明确说明当表达式“复制/粘贴”到函数中时,它不会改变其他操作的优先级;例如,3 * c相当于3 * (x + y),而不是3 * x + y

c被表达式y + z代替而不是简单变量的事实在这里不会造成任何问题,因为c从未出现在赋值的左侧声明。