Подтвердить что ты не робот

Динамические и статические разности программ

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.

4b9b3361

Ответ 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