使用动态范围的给定伪代码的输出是什么?在这里,我想知道将打印的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);
}
自从我第一次误解了您的问题并为C词汇范围提供了答案,让我们将其作为比较。
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的值取决于执行路径,并且查看代码,唯一知道我们正在修改本地变量还是全局变量的唯一方法是在精神上重新创建程序的流程。在更复杂的情况下,这很快可能变得很困难。
非动态范围允许更容易遵循给定标识符的范围(只需追溯静态示波器链)。
具有动态范围,每个标识符都有一个全局的绑定。引入本地带有名称X的变量将绑定推向全局X堆栈(可能已经空的),当控件流留下示波器时会弹出。在任何情况下评估X始终产生最高的结合。换句话说,全球标识符是指与最新环境相关的标识符。请注意,这不能在编译时间完成,因为绑定堆栈仅在运行时存在,这就是为什么这种类型的范围称为动态范围。http://en.wikipedia.org/wiki/scope_(computer_science)
阅读了此理论。如果我使用动态范围回答这个问题首先,将main()称为x = 7,y = 8被推入堆栈中,然后当q()称为q()时,将其按下x = 3,y = 4;现在p(n)没有声明x,因此它将使用x的最后一个调用作为q()中的声明,并将其值更新为'6'。
然后,当q()范围将结束时,其值将被弹出,而全球调用的值x = 7,x = 8将保留在那里。x = 7将被打印。
ans:6和7被打印