Динамические и статические разности программ
int x;
int main() {
x = 14;
f();
g();
}
void f() {
int x = 13;
h();
}
void g() {
int x = 12;
h();
}
void h() {
printf("%d\n",x);
}
Если используется статическое оглавление, каков результат? Если используется динамическое масштабирование, каков результат?
Теперь, если я понимаю право на выборку, разница между статическим и динамическим охватом статична делает переменные локальными для класса. Таким образом, значение X будет локальным по отношению к void f(), Void g() и int main(), и динамика сделает их доступными по всему миру. Я просто не уверен, как применить его к этому коду. если статический был использован, он будет печатать только последнее значение (12 из void g()), а динамическое будет использовать все значения X?
Я немного смущен тем, как на самом деле работает. Я знаю, что C использует Static scoping.
Ответы
Ответ 1
Статическая область видимости означает, что x
относится к x
объявленной самой внутренней области декларации, которая имеет один. Поскольку h
объявляется внутри глобальной области видимости, самый внутренний x
является тем, который находится в глобальной области видимости (он не имеет доступа к x
в f
и g
, поскольку он не был объявлен внутри них), поэтому программа дважды печатает 14
.
Динамическое масштабирование означает, что x
относится к x
, объявленному в последнем фрейме стека вызовов, который имеет один. Если C использует динамическое масштабирование, h
будет использовать x
либо из f
, либо g
- в зависимости от того, кто его вызвал, поэтому программа напечатала 13
и 12
.
Ответ 2
C/С++ не использует динамическое масштабирование. Ваш язык программирования будет использовать тот или иной, вы не можете выбрать (если вы не используете Clojure! Согласно Идану Арие ниже).
Вот отличное объяснение/сравнение с хорошим примером:
http://msujaws.wordpress.com/2011/05/03/static-vs-dynamic-scoping/
Ответ 3
В статическом охвате область определения определяется его местоположением в коде, и поскольку это не изменяется, то область тоже не меняется. При динамическом охвате область видимости определяется последовательностью вызовов, которая привела к использованию идентификатора, и поскольку это может быть различным при каждом использовании, является динамическим.
В вашем примере, при статическом охвате, x в h всегда будет глобальным x, независимо от того, как h был вызван. Но с динамическим охватом, это будет относиться к x, объявленному в f или объявленному в g, в зависимости от того, что вызвало h в это конкретное время.
Ответ 4
Это точно доказанные ans
в
статическая область. Когда глобальной переменной присваивается значение, она будет существовать во время выполнения программы.
Следовательно, ответ для этого: 14
и 14
.as C-language обладает статическим охватом, и вы можете проверить его в компиляторе TURBO-C.
Где, как когда и приходят к
Динамическое масштабирование. Независимо от значения глобальной переменной. Рассматривается значение, назначенное в блоке.
поэтому Ответ: f()=13
и g()=12
Ответ 5
Рассмотрим следующий фрагмент кода
int x=10;
Здесь значение 10 хранится в определенном месте в памяти, а имя "x" привязано к этому местоположению.
Область действия - это часть программы, в которой действует привязка. Простыми словами, частью программы, где видна переменная.
"Часть программы" может ссылаться на определенную часть кода (статическая область) или часть времени выполнения (динамическая область), где эта привязка действительна.
> В этом случае
int x; //X1
int main() {
x = 14;
f();
g();
}
void f() {
int x = 13; //X2
h();
}
void g() {
int x = 12; //X3
h();
}
void h() {
printf("%d\n",x);
}
X1 можно получить в любом месте программы. Таким образом, в main() X1 присваивается значение 14.
Когда вызывается f(), создается новая переменная (сохраненная в новой ячейке памяти) 'x' (X2), локальная по отношению к f(), и инициализируется значение 13 и когда вызывается g(), аналогично создается новая переменная 'x' (X3), локальная для g() со значением 12.
В статическом охвате
когда f() или g() вызывает h(), X2 и X3 не видны вне f() и g() соответственно (часть кода), тогда как X1 отображается глобально, поэтому выход будет быть
14
14
В динамическом режиме
Когда f() выполняет имя "x" , привязывается к X2 и когда f() вызывает h(), функция f() все еще выполняется, а имя "x" все еще привязано к X2, поэтому локальный X2 будет напечатан к выходу. После выполнения f() это связывание не существует (часть времени выполнения), а "x" привязывается к X1. И когда выполняется g(), имя "x" привязывается к X3. И когда h() вызывается, f() все еще выполняется, а имя "x" все еще привязано к X3, поэтому локальный X3 будет напечатан и выход будет
13
12
Ответ 6
Статическая область: Статическая область относится к области переменной, которая определена во время компиляции. Он всегда относится к переменной с средой верхнего уровня.
В этой программе результат статической области составляет 14 и 14, потому что f() и g() всегда возвращают значение глобальной переменной x. f() и g() не зависят от того, кто их вызывает.
Динамическая область: Динамическая область относится к области видимости переменной, которая определена во время выполнения. Он относится к идентификатору с самой последней средой. Это что-то вроде динамического программирования, потому что в dp значение обновляется.
В этой программе результат динамической области составляет 13 и 12, так как f() и g() возвращают текущую переменную x, а не глобальную.
Ссылка: GeeksforGeeks