【发布时间】:2013-02-06 09:08:40
【问题描述】:
我在静态/动态范围内遇到以下问题:
以下程序片段是用允许全局的编程语言编写的 变量,并且不允许函数的嵌套声明。
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
第二季度。如果编程语言使用动态作用域并按名称调用 参数传递机制,上面程序打印的值 是
(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.
这个答案正确吗? (选项中不存在) 有什么我想念的吗? (可能是动态绑定?)
【问题讨论】:
-
你发现了吗?我遇到了同样的问题!!
标签: c scope dynamic-binding dynamic-scope callbyname