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 .