※ 引述《tinlans.bbs@whshs.cs.nccu.edu.tw (汀)》之銘言:
> 這個叫做 by value(有人稱之 pointers as call-by-value parameters),
> 至於 reference 和 address 是一樣的東西...
> 外國的名書不太可能對這種寫法說成 call by address,
> 說這是 call by address 的其實都是中文書...
> 其實看 call/pass by value or address/reference,
> 跟 function parameter 的 syntax 關係不大,
> 主要是看呼叫端跟接收端參數之間的關係...
> 不必寫明是丟變數的 reference(也就是語義上是丟變數本身),
> 但是接收到的卻是該變數的一個 reference,
> 那這種情形才叫做 call by reference(或叫 call by address)。
> 在 C++ 來說,呼叫 foo(int *) 這種 function 的情形一定是 call by value,
> 因為你永遠是 pass 一個 pointer 的 value 過去(foo(&var) 或 foo(ptr)),
> 當然可能會有人爭論 pass array 跟 function 過去怎麼會自動傳 address,
> 但是事實並不是表面上看到的那樣....
> C++ 的世界裡 function call 存在著 argument type conversion,
> 其中符合 exactly match 的轉換動作共有四種:
> 1. lvalue-to-rvalue conversion
> 2. array-to-pointer conversion
> 3. function-to-pointer conversion
> 4. qualification conversion
> (可能很多人看 C++ Primer 這裡都跳過,加上 C++ 爸爸的書把它放在附錄...)
> 因此從 language 的角度來看,
> 你把 array 或 function 當成 arguments 丟進去,
> 即使你不明確寫出 address-of operator(就是 &),
> 它還是會自動幫你轉換成 pointer 才丟進去(這就是語法跟語義的差異),
> 原因是它分別會進行上述的 2. 和 3. 的轉換,
> 而並非接收端直接抓到呼叫端傳入變數的 address/reference。
> 解釋這種東西 down 到 asm code 去看沒有意義,
> 因為這是 language 中語法和語義上的概念,
> 不熟 C++ 的人常會因為 C++ 語法複雜,
> 所以誤會 C++ 重視的是語法本身,
> 其實 C++ 重視的跟 C 一樣只是語義,
> 雖然 C++ 的某些高等技術確實會用到 syntax-oriented programming 的方法,
> 但那都是從入門開始算起來很久之後才碰得到的事情了...
> C++ 中文書剛出來的那段日子裡,
> 曾經看到有書寫 C++ 有三種參數傳遞方式,
> call by value、call by address 和 call by reference。
> 當時我們幾個已經玩 C++ 一陣子的人看到都笑了,
> 就該書的內容來說,前兩者應該都是 call by value,
> 至於 call by reference 本身其實就是 call by address,
> 只是 C++ language 本身明確使用 reference 這個名詞和功能做為語言的一部份,
> 所以很少有人會在 C++ 用 call by address 這種名詞了...
> 至於把 pointers as call-by-value parameters 誤認為 call by address 的,
> 那只能說是一場誤會,要怪可能就要怪中文書都亂寫。
如果這樣說的話...
那JAVA和C#為何都不能call by address?
都叫做call by reference?
C++ .Net也是除非在unsafe下才能call by address??
如果說call by address == call by reference的話
為何C++ .Net還要有這種區別呢?
--
╭┼ Origin: 幽谷˙反地球聯邦組織 aeug.twbbs.org
┼┘ Author: GP02 從 ns1.e-twlink.com 發表