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は名前で呼び出されるため、return(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の3番目の命令では、z = R(z ++)があります。これは、名前による呼び出しにより、z =(z ++ + x ++ + y ++)と同等のものに拡張されます。

したがって、z値を取得します。これは19で、20にインクリメントします(ポストインクリメント)。これをBx(6)の値に追加し、Bxを7に変更します。7をyから追加し、y(Bx)を8に増分します。したがって、z = 19 + 6 + 7=32です。Bxは8です。

zのvalueresultにより、Ayは32に変更されます。

Pの外側では、write(y ++、x ++)は32であるAy値を取得し、それを出力します。次に、Ayは33に変更されます。8であるBxが印刷され、9に変更されます。したがって、 32、8が印刷されます。

最後に、Ayが印刷されます(値は33です)。斧は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 に答える