我在静态/动态范围内遇到以下问题:
下面的程序片段是用允许全局变量但不允许函数嵌套声明的编程语言编写的。
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);}
Q1。如果编程语言使用静态作用域和按需参数传递机制调用,上述程序打印的值是
(A) 115, 220 (B) 25, 220 (C) 25, 15 (D) 115, 105
Q2。如果编程语言使用动态作用域和按名称调用参数传递机制,则上述程序打印的值是
(A) 115, 220 (B) 25, 220 (C) 25, 15 (D) 115, 105
我的想法:
在 Q1:因为它是静态范围,并且根据需要调用,x 应该替换为 i + j。但这会导致本地名称冲突,因为已经有一个名为 i 的变量。所以它(全局 i)可能会被重命名,让我们说 i1,然后调用将是:
first call: print(x+10) -> (i1 + j + 10) -> (100 + 5 + 10) -> 115
second call: print(x) -> print(i1 + j) -> 105 (Already evaluated - call by need)
关于 Q2:在动态作用域中,您首先在本地函数中搜索变量,然后在调用本地函数的函数中搜索,然后在调用该函数的函数中搜索,依此类推,直到调用堆栈。
根据名称调用:
print (i1 + j + 10) -> print (100 + 5 +10 ) -> 115
第二个电话将是
print(x) -> print(i1 + j) -> (100 + 20) = 120 // Evaluate again - Call be name.
这个答案正确吗?(选项中不存在)我缺少什么吗?(可能是动态绑定?)