小屋創作

日誌2018-07-09 18:00

Call by value, Call by reference (address), Call by name, Call by value and copy restore

作者:GJLMoTea


程式傳遞參數的方法有很多種,
近代程式語言常用的只有call by value call by reference(address) 兩種
call by name copy restore 則見於早期程式語言



先來舉個例子


在以下程式碼,
Call by value
Call by reference (or Call by address)
Call by name
Call by value and copy restore
四個各別會印(print)出什麼結果呢?


1   Program Test:           
2   begin                       
3     x=1;                
4     y=2;             
5     SUB(x,x+y);          
6     print(x);            
7   end;               
8                    
9                    
10   Program SUB(i,j):         
11   begin                
12     i=i+1;           
13     print(x);          
14     i=i+j;             
15     print(i);            
16   end;              






(做成圖片的樣子)








Answer 不同call by的答案
Call by value:1,5,1
Call by reference (or Call by address):2,5,5
Call by name:2,6,6
Call by value and copy restore:1,5,5

Call by value 和 Call by reference 還蠻好理解的,但我以前一直搞不懂Call by name為什麼是這個結果,以下來一一解釋






Call by value:
        5行   SUB(x,y)是傳value SUB(1,3)進去副程式,副程式裡的i,j為1,3,
       12行    接著i=i+1   加完後此時i=2
       13行    print(x)  x數值是第3行宣告的1,於是第一個印出來的是1。
       14行    i=i+j  也就是i=2+3 加完後i=5
       15行    print(i),於是第二個印出來是5。
      副程式跑完回到主程式
        6行     print(x),x的數值從頭到尾都沒有動過,x數值仍是第3行宣告的1,於是第三個印出來的是1








Call by reference (Call by address):
        5行     SUB(x,y)是傳x,y的參考(address)  SUB(x,y)進去副程式,副程式裡的i,j跟x,y是命運相連體 為1,3,x等於i,y等於j
      在副程式裡對i (x address), j (y address)做操作 等於是對x,y變數做操作,副程式參數會影響主程式
       12行    接著i=i+1   加完後此時i=2 (也就是x=2)
       13行    print(x)  x數值是2,第一個印出來的是2
       14行    i=i+j  也就是i=2+3 加完後i=5(也就是x=5)
       15行    print(i),於是第二個印出來是5。
      副程式跑完回到主程式
        6行     print(x),x數值是第14行跑出來的5,於是第三個印出來的是5







Call by name:
        5行     SUB(x,y)是傳x,y的變數名稱,把SUB(i,j) 替換成 SUB(x,x+y)進去副程式,副程式裡的(i,j)被取代成(x,x+y)
      於是在副程式看到 i 就等於看到 x 看到 j 就等於看到 x+y
       12行    接著i=i+1   =>x=x+1加完後x=2
       13行    print(x)  x數值是2,第一個印出來的是2
       14行    i=i+j  =>  x = x + (x+y)  =>  x=2+(2+2)    加完後 x=6
       15行    print(i)   =>   print(x),於是第二個印出來是6。
      副程式跑完回到主程式
       6行     print(x),x數值是第14行跑出來的6,於是第三個印出來的是6

      call by name 的設計傳參數時 偶爾會產生Bug,例如 當 SUB(x+y , x) 時,
      會發生第12行 i = i+1  =>  x+y = x+y +1的情況









Call by value and copy restore:
和Call by value很像,只差在於 離開副程式function時 會把變數值存回位址
        5行     SUB(x,y)是傳value SUB(1,3)進去副程式,副程式裡的i,j為1,3,
       12行    接著i=i+1   加完後此時i=2
       13行    print(x)  x數值是第3行宣告的1(因為此時還未離開副程式,沒有把值存回x變數的位址),於是第一個印出來的是1。
       14行    i=i+j  也就是i=2+3 加完後i=5
       15行    print(i),於是第二個印出來是5。
      副程式跑完回到主程式 離開副程式,把 i 值(5)存回 x 位址
        6行     print(x),x數值仍是離開副程式存回的 5,於是第三個印出來的是5



3

2

LINE 分享

相關創作

2

日本各城市(東京大阪京都等) 素食蔬食餐廳統整 (日本蔬食素食餐廳)

【方式】

留言

開啟 APP

face基於日前微軟官方表示 Internet Explorer 不再支援新的網路標準,可能無法使用新的應用程式來呈現網站內容,在瀏覽器支援度及網站安全性的雙重考量下,為了讓巴友們有更好的使用體驗,巴哈姆特即將於 2019年9月2日 停止支援 Internet Explorer 瀏覽器的頁面呈現和功能。
屆時建議您使用下述瀏覽器來瀏覽巴哈姆特:
。Google Chrome(推薦)
。Mozilla Firefox
。Microsoft Edge(Windows10以上的作業系統版本才可使用)

face我們了解您不想看到廣告的心情⋯ 若您願意支持巴哈姆特永續經營,請將 gamer.com.tw 加入廣告阻擋工具的白名單中,謝謝 !【教學】