使用shallow binding(浅绑定)时给定伪代码的输出结果是多少?
浅绑定(Shallow Binding)作用域计算问题
问题描述
当采用浅绑定规则时,下方伪代码运行后的输出值为多少?
x : integer := 3 // 全局作用域 y : integer := 4 // 全局作用域 procedure add x := x + y procedure second(P : procedure) x : integer := 5 P() procedure first y : integer := 6 second(add) first() // 主函数中首次调用过程 write integer(x) // 打印变量值
疑问点
运行first()后,add()修改的是second的局部x而非全局x,因此输出应为3?但给出的参考答案为:动态作用域(浅绑定)下计算逻辑为(x=5+y=6)=11,求正确结果及对应原理说明。
原理说明与正确结果
基础定义
浅绑定是动态作用域的典型实现逻辑,核心规则为:函数执行时查找非局部变量,优先从调用链上最近的活跃调用帧中匹配同名变量,而非从函数定义时的静态作用域匹配。
本次代码的调用链为:main调用first → first调用second → second调用add,执行add时所有上层调用帧的变量均处于活跃状态。
两种场景的结果
场景1:second内的x : integer := 5为全局变量赋值(参考答案适用场景)
如果伪代码中该语句仅为对已声明的全局x赋值,而非创建新的局部变量,执行流程如下:
- 全局初始化:
x=3,y=4 - 调用
first():创建局部变量y=6,覆盖全局y的绑定 - 调用
second(add):修改全局x的值为5 - 调用
add():- 查找x:最近的活跃x为全局x,值为5
- 查找y:最近的活跃y为first的局部y,值为6
- 计算后全局x被修改为
5+6=11
- 所有函数执行完毕,主函数打印全局x,输出11,和参考答案一致。
场景2:second内的x : integer := 5为显式声明局部变量(你的初始判断适用场景)
如果该语句为创建仅在second内生效的局部变量,执行流程如下:
- 前3步和场景1一致,只是
second内创建的局部x仅在second执行期间有效,全局x仍为3 - 调用
add():- 查找x:最近的活跃x为
second的局部x,值为5 - 查找y:最近的活跃y为
first的局部y,值为6 - 计算后仅修改
second的局部x为11,全局x的值未发生变化
- 查找x:最近的活跃x为
second执行完毕后局部x销毁,主函数打印全局x,输出3,符合你的初始判断。
内容的提问来源于stack exchange,提问作者Grace Mathew
相关产品推荐
相关产品推荐

