Вывод этой программы с использованием различных правил определения объема / привязки и передачи параметров? - PullRequest
0 голосов
/ 16 января 2011

Это (действительно) тяжелое упражнение для моего следующего экзамена. Он предназначен для определения областей видимости, связывания и передачи параметров. Я не могу понять даже первые 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 }

Ответы [ 2 ]

1 голос
/ 25 января 2011

Ax = 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.

При записи будет напечатано значение x, которое необходимов динамическую область Bx, поэтому будет напечатано 6. Y - ссылка на тот же Bx, поэтому будет напечатано 6. Z - 19. Таким образом, будет напечатано 6, 6, 19 .

В третьей инструкции P мы имеем 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 значение Ay будет изменено на 32.

За пределами P запись (y ++, x ++) получит значение Ay, равное 32, и напечатает его.Тогда Ay изменится на 33. Bx, который равен 8, будет напечатан и изменен на 9. Таким образом, он напечатает 32, 8 .

Наконец, Ay будет напечатан (его значение равно33).Будет напечатан топор, который будет 5. . Таким образом, будет напечатано 33, 5 .

. В заключение программа напечатает 6, 6, 19, 32, 8, 33,5 .

0 голосов
/ 21 января 2011

Вот что я придумал - построчно:

   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 * ​​1004 *

      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

...