Лексический обзор и динамический обзор
Таким образом, у меня есть проблема, когда я должен выяснить результат, используя два разных правила определения объема. Я знаю, что вывод с использованием лексической области видимости a=3
а также b=1
, но мне трудно разобраться с выходом с помощью динамического определения объема.
Примечание. В следующем примере кода используется синтаксис языка Си, но давайте просто обработаем его как псевдокод.
int a,b;
int p() {
int a, p;
a = 0; b = 1; p = 2;
return p;
}
void print() {
printf("%d\n%d\n",a,b);
}
void q () {
int b;
a = 3; b = 4;
print();
}
main() {
a = p();
q();
}
Вот что я придумаю. Используя динамическую область видимости, нелокальные ссылки на a
а также b
может измениться. Так что я a=2
(возврат из p()), затем b=4
(внутри q()). Таким образом, выход 2 4
?
2 ответа
Как мы знаем, C не имеет динамической области видимости, но при условии, что она есть, программа напечатает 3 4.
В основном, А и В являются глобальными. a будет установлен в 2, так как мы увидим, что это то, что вернёт p.
В p, вызванном из main, b все еще является глобальным, но a является локальным в p. Местный a установлен в 0, но скоро исчезнет. Глобальное b установлено в 1. Локальное p установлено в 2, и 2 будет возвращено. Теперь глобальный b равен 1.
В q, вызванном из main, a является глобальным, а b локальным в q. Здесь глобальный a установлен в 3, а локальный b в 4.
В печати, вызываемой из q, a является глобальной (которая имеет значение 3), а b является локальной в q (которая имеет значение 4).
Именно на этом последнем шаге, внутри функции print, мы видим отличие от статической области видимости. Со статической областью видимости a и b будут глобальными. При динамическом определении объема мы должны рассмотреть цепочку вызывающих функций, а в q мы находим переменную b, которая будет b, используемой внутри print.
C не является динамически ограниченным языком. Если вы хотите поэкспериментировать, чтобы понять разницу, вам лучше использовать такой язык, как Perl, который позволяет выбирать между ними.