2014-10-16 65 views
0

我無法理解我們回來的作業答案。我相信我對「嵌套」函數的概念感到困惑,但也許這是錯誤的。我正在尋找一些關於遵循以下代碼中動態和靜態範圍值分配的幫助。程序語言理解 - 靜態vs動態範圍

x : integer -- global 

procedure set_x(n : integer) 
    x := n 
end 

procedure print_x 
    write_integer(x) 
end 

procedure first 
    set_x(1) 
    print_x 
end 

procedure second 
    x : integer 
    set_x(2) 
    print_x 
end 

// program starts here 
set_x(0) 
first() 
print_x 
second() 
print_x 

Static Scoping Output: 1122 
Dynamic Scoping Output: 1121 

我的想法,因爲我經過每一個:

靜態:

  • 運行set_x(0),這使得一個局部變量,由於n的參數,但由於我們集合X在沒有本地聲明x(int x = ..)的情況下,我們將全局x更新爲0.
  • 運行first(),其確實爲set_x(1),其跟隨t他相同的邏輯將x更新爲全局1。那麼,我們先內用於打印的1
  • 運行print_x全球x,它只是重新打印1.
  • 運行second()我們本地x聲明並運行set_x(2),肚裏更新2到n運行print_x。 (因爲set,而不是second程序的,對不對?然後,我們運行其print_x的過程,它打印2
  • 運行print_x這又只是轉儲出的2
  • 在1122

所得動態(更加困惑在這一個)

  • 運行set_x(0)其設定x和全局x爲0
  • 運行first()我們一次更新命中set_x x到1.打印1.
  • 運行print_x我們重新打印1.
  • 運行second()我們在當地做X,我們運行set_x(2),並設置全局x爲2。然後,我們打印2.
  • 運行print_x最後,我們再重新打印和這裏就是我猜2,但答案應該1.
  • 我猜1122,實際的答案是1121

我合作nfused對動態的那最後部分,爲什麼它是1,而不是2

回答

0

這是一種難以跟隨你的推理在一些地方,因爲你不說x你認爲是印刷或更新,這幾乎是整個蠟球。

最重要的事情要記住的是,靜態範圍(也稱爲詞法範圍)在編譯時完全確定。 定義爲確定其靜態範圍。

動態範圍當然是相反的;它是在運行時確定的。 執行確定其動態範圍。

所以,看看set_x程序。它本身沒有本地的x,並且它在全球範圍內定義,所以在靜態範圍內,它只能更新全球x。即使在second程序內,無論它被稱爲都是如此。

在動態範圍界定,但是,內secondset_x呼叫更新x這是本地second,使全球x不變。

注意,最後print_x通話將始終打印全球x,無論範圍規則(因爲print_x過程是在全球範圍內定義,並print_x呼叫在全球範圍內執行)。所以區別在於,在靜態範圍界定中,全局x在程序結束時爲2;但是通過動態範圍設定,全局x爲1.

+0

因此動態範圍設定爲2的原因是因爲它是在該時間點打印的局部變量,而不是全局變量x? (因爲局部x在第二個中定義)。如果這是真的,這個x在set_x方法中仍然被設置爲2,但是由於set_x是從第二個調用的,它仍然將本地x設置爲第二個而不是全局? – Austin 2014-10-17 02:18:00