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

静态与动态作用域下四种传参方式的伪代码输出验证及求解

先看一下咱们要分析的伪代码:

{ 
  int x = 2; 
  void fie(reference int y) { 
    y = x + y; 
    x = x + 1; 
  } 
  { 
    x = 3; 
    { 
      int y = 5; 
      int x =6; 
      fie(x); 
      write(x); 
    } 
  } 
  write(x); 
}

接下来逐个拆解四种场景的输出逻辑:

1. 静态作用域 + 传引用(static/pass-by-reference)

输出结果:9 和 4
分析逻辑:

  • 静态作用域的核心是「变量找定义时的外层作用域」,所以fie函数里的x,指向的是它定义时外层那个被赋值为3的x,而非调用时局部的x=6。
  • 传引用意味着fie的参数y直接绑定调用时传入的局部x=6。执行y = x + y时,就是y = 3 + 6 = 9,这个修改会直接同步到绑定的局部x上,所以第一个write(x)输出9。
  • 接着fie里执行x = x + 1,这里的x是外层的x=3,因此它被修改为4。最后第二个write(x)输出的就是这个被更新后的外层x,也就是4。

2. 动态作用域 + 传引用(dynamic/pass-by-reference)

输出结果:13 和 3
分析逻辑:

  • 动态作用域的核心是「变量找调用时的当前作用域」,所以fie函数里的x,用的是调用点那个局部的x=6。
  • 传引用让y绑定这个局部x=6,执行y = x + y就是y = 6 + 6 = 12,局部x被改成12。
  • 然后fie里执行x = x + 1,这里的x还是调用时的局部x,因此它变成13,第一个write(x)输出13。
  • 外层那个被赋值为3的x全程没被修改,所以第二个write(x)输出3。你的判断是完全正确的~

3. 静态作用域 + 传值(static/pass-by-value)

输出结果:6 和 4
分析逻辑:

  • 静态作用域下,fie里的x依然是外层的x=3。
  • 传值意味着y是调用时传入的局部x=6的副本,执行y = x + y得到3+6=9,但这个修改只影响副本,不会改变原来的局部x。
  • 接着fie里的x = x + 1把外层的x=3改成4。调用结束后,局部x还是6,所以第一个write(x)输出6,第二个write(x)输出4。

4. 动态作用域 + 传值(dynamic/pass-by-value)

输出结果:7 和 3
分析逻辑:

  • 动态作用域下,fie里的x是调用点的局部x=6。
  • 传值的y是x=6的副本,执行y = x + y得到6+6=12,副本修改不会影响原变量。
  • 然后fie里执行x = x + 1,这里的x是调用时的局部x,因此它从6变成7,第一个write(x)输出7。
  • 外层的x=3没有被改动,所以第二个write(x)输出3。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:24:38