Лексический обзор и динамический обзор

Таким образом, у меня есть проблема, когда я должен выяснить результат, используя два разных правила определения объема. Я знаю, что вывод с использованием лексической области видимости 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, который позволяет выбирать между ними.

Другие вопросы по тегам