使用DYNAMIC SCOPING的给定伪代码的输出是什么? 在这里,我想知道将要打印的x的值是什么。
它只是一种类似于C但具有动态范围的语言中的简单伪代码。
integer x,y;
p(integer n){
x=(n+2)/(n-3);
}
q(){
integer x,y;
x=3;
y=4;
p(y);
write(x);
}
main(){
x=7;
y=8;
q();
write(x);
}
答案 0 :(得分:1)
由于我第一次误解了你的问题,并提供了C词汇范围的答案,让我们把它作为比较。
符号x和y将对应于2个可能的变量
让我们调用x0,y0在toplevel和xq声明的变量,yq在q中声明的变量。
x0 = 7
y0 = 8
q ->
xq = 3
yq = 4
p(4) ->
x0 = 6 // (4+2)/(4-3)
write(xq) // OUTPUT: 3
write(x0) // OUTPUT: 6
我们将显示符号绑定堆栈以跟踪符号当前值
x0 = 7 // x:(x0)
y0 = 8 // y:(y0)
q -> // declaring x,y in q -> x:(x0,xq) y:(y0,yq)
xq = 3 // x:(x0,xq)
yq = 4 // y:(y0,yq)
p(4) ->
xq = 6 // x:(x0,xq)
write(xq) // OUTPUT: 6
// leaving q -> x:(x0) y:(y0)
write(x0) // OUTPUT: 7
这个例子很好地说明了动态范围的危险性/复杂性:
从p内部开始,x的值取决于执行路径,并且查看代码,了解我们是修改本地变量还是全局变量的唯一方法是在心理上重新创建程序流。在中等复杂的情况下,这很快就会变得非常困难。非动态范围允许更容易地遵循给定标识符的范围(简单地通过追溯静态范围链)。
答案 1 :(得分:0)
使用动态范围,每个标识符都有一个全局绑定堆栈。介绍一个当地的 名为x的变量将绑定推送到全局x堆栈(可能已为空),当控制流离开作用域时,该堆栈将弹出。在任何上下文中评估x总是产生顶部绑定。换句话说,全局标识符指的是与最新环境相关联的标识符。请注意,这不能在编译时完成,因为绑定堆栈仅存在于运行时,这就是为什么这种类型的 范围界定称为动态范围。 http://en.wikipedia.org/wiki/Scope_(computer_science)
阅读了这个理论..如果我使用动态范围来回答这个问题 首先,当main()被调用x = 7和y = 8被推入堆栈时,然后当调用q()时,它推动x = 3和y = 4;现在p(n)没有声明x,所以它将使用x的最后一次调用作为q()中的声明,并将其值更新为'6'。
然后当q()的范围结束时,它的值将从堆栈中弹出,并且全局调用的x = 7和x = 8的值将保留在那里,因此将打印x = 7。
ANS:打印6和7