首页 > 解决方案 > 通过名称传递评估变量

问题描述

我正在学习参数传递。

我一直在研究一个关于参数传递的问题,但我不明白一个问题。

我搜索了互联网,但没有参数是表达式的示例。

如果它是一个表达式,我可以知道如何评估 pass-by-name 吗?

问题如下。

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

标签: parametersparameter-passingprogramming-languagespass-by-name

解决方案


来自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从未出现在赋值语句的左侧。


推荐阅读