嗯,我和我的朋友之间就下面的代码进行了辩论。我们对它产生的输出感到有点困惑。有人可以澄清下面一段代码的按引用调用和调用值结果吗?
app.get('/call_3image_stream', function(req, res){
res.writeHead(200, {'Content-Type' : 'image/png'});
var path = (__dirname + '/test_folder/happy_bottom.png');
var path2 = (__dirname + '/test_folder/happy_right.png');
var path3 = (__dirname + '/test_folder/happy_left.png');
gm(path)
.composite(path2)
.composite(path3)
.stream('png')
.pipe(res);
})
在该程序的结果输出的情况下 参数通过值结果和参考传输到过程p。
答案 0 :(得分:3)
按值调用
x
中的{p {1}}和y
是使用实际参数进行初始化的局部变量,而p
是一个全局变量,因此调用i
相当于:
p( a[i],a[i] )
并且最后打印值1,2,因为它们是x := 1 /* The value of a[i] */
y := 1 /* The value of a[i] */
x := 2 /* x + 1 */
i := 2 /* i + 1 */
y := 2 /* y + 1 */
,a[1]
的值,但未被更改。
按参考号召集
a[2]
中的x
和y
都是p
和({再次)a[1]
的别名(自a[1]
起调用过程时),所以这个电话相当于:
i = 1
并且最后打印出值3,2。
按名称呼叫
当简单变量作为参数传递时,按名称调用等效为Call by Reference,但当您传递表示内存位置的表达式时,不同,如标。在这种情况下,每次遇到实际参数时都会重新评估。所以在这种情况下,这是调用a[1] := 2 /* a[1] + 1 */
i := 2 /* i + 1 */
a[1] := 3 /* a[1] + 1 */
:
p( a[i],a[i] )
并且最后打印值2,3。实际上,每次实现必须评估参数时,实现都会调用匿名函数(“thunk”)。
按值结果调用
为了完成讨论,以下是value-result参数传递的情况,其中a[1] := 2 /* since i = 1, the result is equal to a[1] + 1 */
i := 2 /* i + 1 */
a[2] := 3 /* since i is now 2, the result is equal to a[2] + 1 */
和x
在过程执行开始时使用实际参数的值进行初始化,并在程序执行结束时,将其复制回原始变量地址:
y
并且最后打印出值2,2。
有关传递参数的不同方法的讨论,请参阅例如this。
答案 1 :(得分:0)
procedure p(x, y: integer);
begin
end;
在这种情况下,作为参数传递的变量永远不会被修改。它们被复制到两个寄存器(可能是x:EAX和y:ECX)或堆栈。 (取决于编译器ABI)
procedure p(var x, y: integer);
begin
end;
在这种情况下,原始参数被修改。 x
和y
是指向作为参数传递的原始变量的指针。