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