静的/動的スコープに関する次の問題で立ち往生しています。
次のプログラムフラグメントは、グローバル変数を許可し、関数のネストされた宣言を許可しないプログラミング言語で記述されています。
global int i = 100, j = 5;
void P(x) {
int i = 10;
print(x + 10);
i = 200;
j = 20;
print (x);
}
main() {P(i + j);}
Q1。プログラミング言語が静的スコープを使用し、必要に応じてパラメーターを渡すメカニズムを呼び出す場合、上記のプログラムによって出力される値は次のとおりです。
(A)115、220(B)25、220(C)25、15(D)115、105
Q2。プログラミング言語が動的スコープと名前による呼び出しパラメーター受け渡しメカニズムを使用する場合、上記のプログラムによって出力される値は次のとおりです。
(A)115、220(B)25、220(C)25、15(D)115、105
私の考え:
Q1:静的スコープであり、必要に応じて呼び出しられるため、xをi+jに置き換える必要があります。ただし、名前iの変数が既に存在するため、ローカル名の競合が発生します。したがって、それ(グローバルi)の名前が変更される可能性があります。たとえば、i1とすると、呼び出しは次のようになります。
first call: print(x+10) -> (i1 + j + 10) -> (100 + 5 + 10) -> 115
second call: print(x) -> print(i1 + j) -> 105 (Already evaluated - call by need)
Q2:動的スコープでは、最初にローカル関数で変数を検索し、次にローカル関数を呼び出した関数を検索し、次にその関数を呼び出した関数を検索し、以下同様に呼び出しスタックを検索します。
名前による呼び出しによると:
print (i1 + j + 10) -> print (100 + 5 +10 ) -> 115
そして2番目の呼び出しは
print(x) -> print(i1 + j) -> (100 + 20) = 120 // Evaluate again - Call be name.
この答えは正しいですか?(オプションにはありません)何か足りないものはありますか?(動的バインディングは可能性がありますか?)