Binding 是否使用不同的作用域/绑定规则和参数传递输出此程序?
这是我下一次考试的一个(非常)难的练习。它用于范围界定、绑定和参数传递规则。我连输出的前3个数字都搞不清楚,这简直让我发疯 这个从左到右具有动态范围、浅绑定和表达式求值的类C程序的输出是什么?Binding 是否使用不同的作用域/绑定规则和参数传递输出此程序?,binding,scope,parameter-passing,higher-order-functions,Binding,Scope,Parameter Passing,Higher Order Functions,这是我下一次考试的一个(非常)难的练习。它用于范围界定、绑定和参数传递规则。我连输出的前3个数字都搞不清楚,这简直让我发疯 这个从左到右具有动态范围、浅绑定和表达式求值的类C程序的输出是什么? 以下是我的想法——逐行跟踪: before P(x,y,Q) A.x = 5 A.y = 7 B.x = 3 entering P A.x = 5 A.y = 7 B.x = 3
以下是我的想法——逐行跟踪:
before P(x,y,Q) A.x = 5 A.y = 7 B.x = 3
entering P A.x = 5 A.y = 7 B.x = 3 y = 3 z = 7
before z = y-- + R(++x + ++y) A.x = 5 A.y = 7 B.x = 3 y = 3 z = 7
entering R w = 9 A.x = 6 A.y = 7 B.x = 3
return (w + x++ + y++)
leaving R w = 9 A.x = 6 A.y = 8 B.x = 4 returns 19
after z = y-- + R(++x + ++y) A.x = 6 A.y = 8 B.x = 4 y = 4 z = 22
write(x, y, z)
6422
before z = R(z++) A.x = 6 A.y = 8 B.x = 4 y = 4 z = 22
entering R w = 22 A.x = 6 A.y = 8 B.x = 4
return (w + x++ + y++)
leaving R w = 22 A.x = 6 A.y = 9 B.x = 5 returns 34
after z = R(z++) A.x = 6 A.y = 9 B.x = 5 y = 5 z = 34
after P(x,y,Q) A.x = 6 A.y = 34 B.x = 5
write(y++, x++)
34 5
356A.x=5
A.y=7
B.x=3
调用p(3,7,Q)-在p,y中是对B.x的引用,B.x的值是3,z是7。由于动态范围,在P内,x是B.x
在p内部,在第一条指令中,我们先计算后减量y,因此计算值为3,B.x将更改为2
R按名称调用,因此返回值(w+x+++y++)将变成return++x+++y+x+++y++。整个第一个表达式被扩展为相当于z=y-->(+++x+++y+x+++y++)
在表达式++x+++y+x+++y++中,我们有一个预增量++x,它将B.x更改为3,结果是3。++y将B.x更改为4并计算4。x++将计算为4并更改为5,y++将计算为5并更改为6
所以Q返回的值是3+4+4+5=16。这将被添加到之前的z--值3中,因此19将被分配给z,B.x将是6
写入将打印x,这是由于动态范围B.x,因此将打印6。y是对相同B.x的引用,因此将打印6。z是19因此它将打印6、6、19
在p的第三条指令中,我们有z=R(z++),由于按名称调用,它将扩展为与z=(z+++x+++y++)等价的东西
所以我们得到了z值,它是19,并且增加到20(后增加)。将其添加到B.x(6)的值中,并将B.x更改为7。将y中的7和增量y(即B.x)相加到8。
所以z=19+6+7=32。B.x是8
由于z的值结果,A.y将更改为32
在p之外,write(y++,x++)将获得A.y值,即32并打印它。然后A.y将变为33。将打印B.x,即8,并将其更改为9因此它将打印32,8
最后,将打印A.y(其值为33)。将打印A.x,即5因此它将打印33,5
最后,程序打印出6,6,19,32,8,33,5我看到不平衡的括号。C:?@Philosoda:第21行是否已修复并清洁,谢谢!对不起,这是错误的。解决方案说明前3个数字是:6,6,19!是 啊也谢谢你。这是一个非常具有挑战性的练习你介意我让你看看这个吗?谢谢。
before z = R(z++) A.x = 6 A.y = 8 B.x = 4 y = 4 z = 22
entering R w = 22 A.x = 6 A.y = 8 B.x = 4
return (w + x++ + y++)
leaving R w = 22 A.x = 6 A.y = 9 B.x = 5 returns 34
after z = R(z++) A.x = 6 A.y = 9 B.x = 5 y = 5 z = 34
after P(x,y,Q) A.x = 6 A.y = 34 B.x = 5
write(y++, x++)
after write(y++,x++) A.x = 6 A.y = 35 B.x = 6
write(y, x)