静态与动态作用域下四种传参方式的伪代码输出验证及求解
先看一下咱们要分析的伪代码:
{ 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
相关产品推荐
相关产品推荐

