web-dev-qa-db-ja.com

動的および静的なスコーププログラムの違い

_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);  
}
_

静的スコープが使用されている場合、結果はどうなりますか?動的スコープが使用されている場合、結果はどうなりますか?

スコープの正しい意味を理解すると、静的スコープと動的スコープの違いは、静的によって変数がクラスに対してローカルになることです。したがって、値xvoid f()void g()、およびint main ()に対してローカルであり、dynamicはそれらをグローバルに使用可能にします。このコードにそれをどのように適用するのかわからないだけです。静的スコープが使用された場合、最後の値(void g()からの12)のみが出力され、動的スコープはx?のすべての値を使用します。

スコーピングが実際にどのように機能するかについて少し混乱しています。ただし、Cは静的スコープを使用します。

34
user1789951

静的スコープとは、xが最も内側に宣言されているxを参照することを意味します宣言のスコープがあります。 hはグローバルスコープ内で宣言されているため、最も内側のxはグローバルスコープ内のものです(xfsにアクセスできません。 g。それらは内部で宣言されていないため)、プログラムは14 2回。

動的スコープは、xが、最新のcall-stackのフレームに宣言されているxを参照することを意味します。 Cが動的スコープを使用した場合、hxまたはfのいずれか(呼び出し元のいずれか)からgを使用するため、プログラムは13および12

41
Idan Arye

C/C++は動的スコープを使用しません。プログラミング言語はどちらか一方を使用しますが、選択することはできません(以下のIdan AryeによるとClojure!を使用している場合を除きます)。

以下に、優れた説明/比較と良い例を示します。 http://msujaws.wordpress.com/2011/05/03/static-vs-dynamic-scoping/

14
Jason Enochs

次のコードスニペットを検討してください

int x=10;    

ここでは、値10はメモリ内の特定の場所に保存され、名前「x」はその場所にバインドされています。
スコープは、このBindingが有効なプログラムの一部です。簡単に言えば、変数が見えるプログラムの部分。
「プログラムの一部」は、コードの特定の部分を指す場合があります(静的スコープ)またはランタイムの一部(動的スコープ)有効です。
この場合

   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  

動的スコープの場合 When f()が実行され、名前 'x'がX2にバインドされ、f()がh( )、関数f()はまだ実行中であり、名前 'x'はまだX2にバインドされているため、ローカルX2が出力に出力されます。f()が実行され、このバインディングは存在しません(ランタイムの部分)、「x」はX1にバインドされます。g() executes、名前 'x'はX3にバインドされます。h()が呼び出されると、f()はまだ実行中で、名前 'x'はまだバインドされていますX3へ。ローカルX3が印刷され、出力は

13
12
4
DataCruncher

静的スコープでは、識別子のスコープはコード内の位置によって決定され、それは変更されないため、スコープも変更されません。動的スコープでは、スコープは識別子の使用につながった呼び出しのシーケンスによって決定され、使用に達するたびに異なる可能性があるため、動的です。

あなたの例では、静的スコープのもとで、hが呼び出された方法に関係なく、hのxは常にグローバルxになります。しかし、動的スコープでは、特定の時間にhを呼び出したものに応じて、fで宣言されたxまたはgで宣言されたxを参照します。

2
Scott Hunter

静的スコープ:静的スコープは、コンパイル時に定義される変数のスコープを指します。常に最上位環境の変数を参照します。
このプログラムでは、f() and g()は常にglobalの値を返すため、静的スコープの結果は14および14です。変数x。f()およびg()呼び出し元に依存しない。

動的スコープ:動的スコープは、実行時に定義される変数のスコープを指します。これは、最新の環境の識別子を指します。 dpでは値が更新されるため、動的プログラミングのようなものです。
このプログラムでは、f() and g() return current variable x value notグローバルなもの。

リファレンス: GeeksforGeeks

0
rashedcs