0

这是我下一次考试的(真的)艰苦的练习。它的目的是为了理解范围、绑定和参数传递规则。我什至无法弄清楚输出的前 3 个数字,这让我发疯。

这个具有动态范围、浅绑定和从左到右的表达式求值的类 C 程序的输出是什么?

1 A : {
2
3    int x = 5;
4    int y = 7;
5
6    proc P(ref int y, valueresult int z, int R(name int)) {
7       z = y-- + R(++x + ++y);
8       write(x, y, z);
9       z = R(z++);
10   }
11
12   B : {
13
14      int x = 3;
15
16      int Q(name int w) {
17           return (w + x++ + y++);
18      }
19
20      P(x, y, Q); // start here
21      write(y++, x++);
22   }
23
24   write(y, x);
25
26 }
4

2 回答 2

1

斧头 = 5

Ay = 7

Bx = 3

调用 P(3, 7, Q) - 在 P 内部,y 是 Bx 的引用,其值为 3,z 为 7。由于动态范围,在 P 内部,x 是 Bx

在 P 内部,在第一条指令中,我们首先评估了后减量 y--,因此评估的值将是 3,而 Bx 将变为 2。

R 按名称调用,因此返回 (w + x++ + y++) 将变为 return ++x + ++y + x++ + y++。整个第一个表达式扩展为等价于 z = y-- + (++x + ++y + x++ + y++)。

在表达式 ++x + ++y + x++ + y++ 中,我们有一个预增量 ++x,它将 Bx 更改为 3 并给出 3 作为结果。++y 将 Bx 更改为 4 并评估为 4。x++ 将评估为 4 并更改为 5,y++ 将评估为 5 并更改为 6。

所以 Q 的返回值是 3 + 4 + 4 + 5 = 16。这将添加到之前的 z-- 值 3,所以 19 将分配给 z,Bx 将是 6。

由于动态范围 Bx,写入将打印 x,因此将打印 6。y 是对同一 Bx 的引用,因此将打印 6。z 是 19。因此它将打印 6,6,19

在 P 的第三条指令中,我们有 z = R(z++),由于按名称调用,它会扩展为等价于 z = (z++ + x++ + y++) 的东西。

所以我们得到 z 值,它是 19 并递增到 20(后递增)。将其与 Bx (6) 的值相加并将 Bx 更改为 7。将 y 中的 7 相加并将 y(即 Bx)增加到 8。因此 z = 19 + 6 + 7 = 32。Bx 为 8。

由于 z 的值结果,Ay 将更改为 32。

在 P 之外, write(y++, x++) 将得到 Ay 值,即 32 并打印它。然后 Ay 将更改为 33。 Bx 即 8 将被打印并更改为 9。因此它将打印 32, 8

最后,将打印 Ay(其值为 33)。将打印 Axe,即 5。因此它将打印 33, 5

最后,程序打印6, 6, 19, 32, 8, 33, 5

于 2011-01-25T03:34:41.030 回答
0

这是我想出的 - 在逐行跟踪中:

   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)

6 4 22

      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

   after write(y++,x++)                     A.x = 6 A.y = 35 B.x = 6
   write(y, x)

35 6

于 2011-01-21T00:04:06.067 回答