Я застрял в следующей проблеме со статической/динамической областью видимости:
Следующий фрагмент программы написан на языке программирования, допускающем глобальные переменные и не допускающем вложенных объявлений функций.
global int i = 100, j = 5;
void P(x) {
int i = 10;
print(x + 10);
i = 200;
j = 20;
print (x);
}
main() {P(i + j);}
Q1. Если язык программирования использует статическую область видимости и вызывает механизм передачи необходимых параметров, значения, напечатанные вышеприведенной программой, будут
(A) 115, 220 (B) 25, 220 (C) 25, 15 (D) 115, 105
Q2. Если язык программирования использует динамическую область видимости и механизм передачи параметров вызова по имени, значения, напечатанные вышеприведенной программой, будут
(A) 115, 220 (B) 25, 220 (C) 25, 15 (D) 115, 105
Что я думаю:
В вопросе 1: поскольку это статическая область видимости и в соответствии с вызовом по необходимости, x следует заменить на i + j. Но это вызовет локальный конфликт имен, так как уже существует переменная с именем i. Так что его (глобальный i) можно переименовать, скажем, в i1, и тогда вызов будет таким:
first call: print(x+10) -> (i1 + j + 10) -> (100 + 5 + 10) -> 115
second call: print(x) -> print(i1 + j) -> 105 (Already evaluated - call by need)
В вопросе 2: при динамической области видимости вы сначала ищете переменную в локальной функции, затем ищете в функции, вызвавшей локальную функцию, затем ищете в функции, вызвавшей эту функцию, и так далее вверх по стеку вызовов.
По вызову по имени:
print (i1 + j + 10) -> print (100 + 5 +10 ) -> 115
И второй звонок будет
print(x) -> print(i1 + j) -> (100 + 20) = 120 // Evaluate again - Call be name.
Этот ответ правильный? (Нет в опциях) Я что-то упустил? (Динамическое связывание может быть?)