我停留在靜態/動態範圍界定如下問題:呼叫的名稱與動態作用域
下面的程序片段是用一種編程語言,讓全球的商業 變量和不允許的功能嵌套的聲明。
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) Q2,105,
, , ,。如果編程語言使用動態範圍界定並通過名稱 參數傳遞機制調用,通過上述程序 印刷的值是
(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
的第二呼叫將
print(x) -> print(i1 + j) -> (100 + 20) = 120 // Evaluate again - Call be name.
這是答案正確嗎? (不存在的選項) 有什麼我失蹤? (動態綁定可以是?)
你摸不着頭腦?我被困在同樣的問題! –