Binding 是否使用不同的作用域/绑定规则和参数传递输出此程序?

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

这是我下一次考试的一个(非常)难的练习。它用于范围界定、绑定和参数传递规则。我连输出的前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 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

356

A.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)