精華區beta Programming 關於我們 聯絡資訊
※ 引述《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 發表