Yahoo Answers is shutting down on May 4th, 2021 (Eastern Time) and beginning April 20th, 2021 (Eastern Time) the Yahoo Answers website will be in read-only mode. There will be no changes to other Yahoo properties or services, or your Yahoo account. You can find more information about the Yahoo Answers shutdown and how to download your data on this help page.

請計概高手進來解答(參數傳遞 CALL referen )

先請問傳址呼叫CALL referen跟傳名呼叫CALL name有啥不同??

如果有一程式如下

sub(x,y,z)

{x=y+z ; y=z-x}

main()

{a=1 ; b=2 ; c=3}

call sub (a , b , a+c) ;

print (a , b , c);}

..................................................................

請問

傳址呼叫(CALL referen)後輸出多少?

傳名呼叫(CALL name)後輸出多少?

PS : 我算的是 傳值呼叫為 1 , 2 , 3

傳址呼叫為 6 , 3 , 3

傳名呼叫為 6 , 3 , 3

但書的答案是

傳值呼叫為 1 , 2 , 3

傳址呼叫為 6 , -2 , 3

傳名呼叫為 6 , -2 , 3

..................................................................................................

到底哪個對呢??

請解答謝謝

Update:

可是書上還有另一題

我本來看是沒問題的

聽各為高手一說又好像怪怪的

請看一下...這樣對嗎??

有一程式如下

sub(a,b,c)

{b=c ; a=b c}

main()

{x=1 ; y=2 ; z=3}

call sub (x , y , y z) ;

print (x, y , z)

請問

傳址呼叫(CALL referen)後輸出多少?

傳名呼叫(CALL name)後輸出多少?

(PS:書上寫是 (5 , 13 , 3) 如果照上面那題算不就是(5 , 10 , 3)才對??)

Update 2:

怎麼加號會不見

在補充一下

有一程式如下

sub(a,b,c)

{b=c ; a=b加c}

main()

{x=1 ; y=2 ; z=3}

call sub (x , y , y加z) ;

print (x, y , z)

Update 3:

先感謝藍色水瓶與心冷兩位大大的回答

看了半天

請問是不是說call by name 跟call by reference出來的答案會不一樣呢??

第一題

call by name = 6 , 3 , 3

call by reference = 6 , -2 , 3

第二題

call by name (5 , 13 , 3)

call by reference (5 , 10 , 3)

是這樣嗎??

2 Answers

Rating
  • SiYu
    Lv 5
    1 decade ago
    Favorite Answer

    Call by refern 下

    sub (a , b , a+c) 用by refern 大部份的狀況下因該是不能被叫用的

    因為a+c 不存在memory 只能說是一個暫時的變數存放a+c 的value

    那假設 某個程式語言充許這樣的呼叫. 把a+c 弄到一個暫時的變數中. 傳此變數的refern 過去. 所以可看成有個temp=a+c=1+3=4

    就變成

    sub(a,b,temp)

    呼叫後的記算結果是

    a=b+temp = 2+4=6

    b=temp-a = 4-6 = -2

    所以call by refern 後 a=6 , b=-2 , c=3 (c 不變, 因為c 沒有從沒被當做refern 傳過去)

    call by name 我覺得答案怪怪的不因該是 a=6 b=-2 c=3 . 因該是 6,3,3

    記然是call by name 那就是把name 傳過去

    sub( a,b,a+c) 在呼叫中會變成如下

    a=b+(a+c) 此時 a = 2+(1+3)=6

    b=(a+c)-a 此時 b = (6+3)-6 = 3

    很相巨集替換. 不過也不知道是對還是不對.

    因為call by name 的行為很怪. 外加很難實做出call by name 因此現在跟本很少有程式語言支持call by name

    Source(s): ME
  • 1 decade ago

    書的答案是對的,一個變數包含有名稱、位址、數值,

    傳址呼叫(CALL referen)可以看做直接對該變數的位置作

    呼叫而傳名呼叫(CALL name)則是指到該變數的名稱。

    為什麼是6、-2、3而不是6、3、3。

    因為這兩種呼叫方法都會使原有的變數改變數值,因此

    做完X=Y+Z,A就變成6了。

    2006-12-26 13:17:58 補充:

    X=Y+Z;=A+A+C=2+1+3=6

    Y=Z-X;

    =(Z)-X,X=A=6,因傳址OR傳名都會改變原值

    SO

    Y=(1+3)-6=-2

    為什麼Z還是1+3,而不是6+3呢?

    因為Z=A+C,而A+C並沒有位址跟名稱,所以不管傳

    名OR傳址,都只會定位到Z,加上程式是順序執行因此Z

    值跟A值的改變並無太大的關係。

    這樣講有點複雜,簡單的說

    X=Y+Z;X=2+1+3=6

    Y=Z-X;這個時候X已經是6,1+3-6=-2

    不曉得這麼說你聽得懂嗎?

    2006-12-26 21:32:32 補充:

    也許是我傳名呼叫的部分記錯了,可能是下面這位說的正確

    --------------------

    既然是call by name 那就是把name 傳過去

    sub( a,b,a c) 在呼叫中會變成如下

    a=b (a c) 此時 a = 2 (1 3)=6

    b=(a c)-a 此時 b = (6 3)-6 = 3

    很相巨集替換. 不過也不知道是對還是不對

    --------------------

    2006-12-26 21:32:50 補充:

    如果上面的講解是對的,Y=B=5,

    B(5),C=Y+Z=5+3;

    A=B+C=13;

    13是合理的。

    不過"傳址呼叫"是算不出13的,當C=Y+Z執行完

    之後,C的值就不會再因Y改變而改變。

    2006-12-26 21:50:57 補充:

    剛剛我去查了一下資料,"就C而言",call by name 跟

    call by reference是一樣的東西,所以在順序執行的程式裡

    ,C的值剛進入函式時就已經不會因為Y的改變而浮動。

    至於我看了什麼資料,我不能打出來。網頁有申明。

    自己看吧

    Source(s): 自己, 心冷的回答, http://libai.math.ncu.edu.tw/bcc16/C/C/
Still have questions? Get your answers by asking now.