📜  门| GATE-CS-2003 |第 73 题

📅  最后修改于: 2021-09-27 05:53:29             🧑  作者: Mango

以下程序片段是用允许变量但不允许函数的嵌套声明的编程语言编写的。

global int i = 100, j = 5;
void P(x)
{
    int i = 10;
    print(x + 10);
    i = 200;
    j = 20;
    print(x);
}
main()
{
    P(i + j);
}

如果编程语言使用静态作用域并通过需要参数传递机制调用,则上述程序打印的值是

(一) 115、220
(乙) 25, 220
(三) 25, 15
(四) 115、105答案: (D)
说明:背景:
Call-by-need 是一种声明式和函数式语言范式。与按值调用相反,它仅在需要时评估提供给函数的参数,并将其缓存以供进一步使用。 Call-by-name 与 call-by-need 有点不同,因为它仅以惰性方式进行评估,但不缓存计算出的值。因此,call-by-need 需要在参数被使用时评估一次,call-by-value 无论是否使用该参数都需要评估它,并且 call-by-name 多次评估相同的参数以及何时使用。

解释 :

在函数P(x) 中,变量 x 的值在任何时候都不会改变。因此,无论调用此函数时它的值是什么,都只会在所有打印语句中使用它。显然,程序会打印 100+5+10, 100+5 即 115, 105。

此解决方案由vineet purswani 提供另一个解决方案:

这里在主函数P(i+j)函数被调用,参数值为 i =100 和 j = 5(因为静态作用域)。现在当 P(100+5) 被调用时,在 P函数,j 是一个自由变量而 i 是一个局部变量。现在看一下 P函数中的步骤:

step_1:局部变量 i 被初始化为值 0。

step_2:这里打印了x+10的值,由于是需要调用的,所以x的值计算为105,存入缓存中供以后使用。这里也打印了115。

step_3:现在,我被赋值为 200。

step_4:这里,j是一个自由变量,所以它的作用域在直接外层块中搜索,直到我们找到变量j的声明。全局变量j的值从5变为20。

step_5: x 值打印为 105。因为它使用 x 的缓存存储值。

输出将类似于 C 编程语言,因为 C 仅执行静态作用域。

此解决方案由Nirmal Bharadwaj 提供
这个问题的测验