You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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赋值,而非创建新的局部变量,执行流程如下:

  1. 全局初始化:x=3,y=4
  2. 调用first():创建局部变量y=6,覆盖全局y的绑定
  3. 调用second(add):修改全局x的值为5
  4. 调用add():
    • 查找x:最近的活跃x为全局x,值为5
    • 查找y:最近的活跃y为first的局部y,值为6
    • 计算后全局x被修改为5+6=11
  5. 所有函数执行完毕,主函数打印全局x,输出11,和参考答案一致。

场景2:second内的x : integer := 5为显式声明局部变量(你的初始判断适用场景)

如果该语句为创建仅在second内生效的局部变量,执行流程如下:

  1. 前3步和场景1一致,只是second内创建的局部x仅在second执行期间有效,全局x仍为3
  2. 调用add():
    • 查找x:最近的活跃x为second的局部x,值为5
    • 查找y:最近的活跃y为first的局部y,值为6
    • 计算后仅修改second的局部x为11,全局x的值未发生变化
  3. second执行完毕后局部x销毁,主函数打印全局x,输出3,符合你的初始判断。

内容的提问来源于stack exchange,提问作者Grace Mathew

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 20:24:03