44
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ただし、静的スコープを使用していることは知っています。

4

6 に答える 6

51

静的スコープとは、スコープを持つ宣言の宣言された最も内側のスコープxを参照することを意味します。はグローバル スコープ内で宣言されているため、最も内側はグローバル スコープ内のものです (これらの内部で宣言されていないため、および内のs にはアクセスできません)。したがって、プログラムは2 回出力します。xhxxfg14

動的スコープとは、呼び出しスタックの最新のフレームで宣言されたものをx参照することを意味します。C が動的スコープを使用した場合、from を使用するか、それを呼び出した方を使用するため、プログラムは and を出力します。xhxfg1312

于 2013-10-19T02:08:45.813 に答える
15

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

良い例との優れた説明/比較は次のとおりです

于 2013-10-19T02:09:10.397 に答える
7

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

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() が呼び出されると、f() にローカルな新しい変数 (新しいメモリ位置に格納される) 'x'(X2)が作成され、値 13 が初期化されます。 g() が呼び出され、同様に、値 12 を持つg() にローカルな別の新しい変数'x'(X3) が作成されます。
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
于 2014-10-05T14:08:12.420 に答える
3

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

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

于 2013-10-19T02:07:05.430 に答える
0

これは正確に証明された ans です

静的スコープ: グローバル変数に値が割り当てられると、そのスコープはプログラムの実行全体にわたって存在します。したがって、これに対する答えは次1414とおりです。C言語は静的スコープを所有しているため、TURBO-Cコンパイラで確認できます。

あなたがいつどこに来るのか

動的スコープ: グローバル変数の値に関係なく、ブロックで割り当てられた値が考慮されます。したがって、答えは次のとおりですf()=13g()=12

于 2014-03-25T18:13:58.203 に答える