以下程序片段是用允许变量且不允许嵌套函数声明的编程语言编写的。
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);
}
如果编程语言使用静态作用域并通过需要参数传递机制进行调用,则上述程序打印的值将为
(A) 115、220
(B) 25,220
(C) 25、15
(D) 115、105答案: (D)
说明:背景:
按需呼叫是一种声明性和功能性语言范例。与按值调用相反,它仅在需要时评估分配给函数的参数,并将其缓存以备将来使用。按名称调用与按需调用有点不同,因为按名称调用仅以惰性方式求值,但不缓存所计算的值。因此,按需调用需要评估一次是否使用了参数,无论值是否被使用,按值调用都需要对其进行评估,按名称调用会多次评估同一参数。以及何时使用。
解释 :
变量x的值在函数P(x)中不会随时更改。因此,无论调用此函数时其值是什么,只有所有print语句都将使用该值。显然,该程序将打印100 + 5 + 10、100 + 5,即115、105。
此解决方案由vineet purswani提供另一个解决方案:
在主函数, P(i + j)函数的参数值为i = 100且j = 5(由于静态作用域),现在调用P(100 + 5)时,在P函数,j是自由变量我是一个局部变量,现在来看一下P函数中的步骤:
步骤_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提供
这个问题的测验