精華區beta Programming 關於我們 聯絡資訊
※ 引述《meltice.bbs@bbs.wretch.cc (三億兩千萬大散戶)》之銘言: > ※ 引述《khoguan.bbs@ptt.cc (Khoguan Phuann)》之銘言: > > 厚厚,關於這幾個名詞,眾說紛紜。 > > 讓我猜猜看,嗯,tinlans 的意思可能是將 call by address > > 與 call by reference 當做同義。而 cplusplus 則是將 > > call by address 本質同等於 call by value. > > 至於誰是誰非,或是各有道理呢?因為最近鄙人深感與人爭辯 > > 之苦,決定靜候公議。 > 我到覺得以C++來說 > foo(int *) , by address 這個叫做 by value(有人稱之 pointers as call-by-value parameters), 至於 reference 和 address 是一樣的東西... 外國的名書不太可能對這種寫法說成 call by address, 說這是 call by address 的其實都是中文書... > 跟 > foo(int &) , by reference > 比較相近耶 其實看 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 的, 那只能說是一場誤會,要怪可能就要怪中文書都亂寫。 -- Name: Tseng, Ling-hua E-mail Address: uranus@it.muds.net School: National Chung Cheng University Department: Computer Science and Information Engineering Researching: Porting GCC and Implementing VLIW instruction scheduler in GCC Homepage: https://it.muds.net/~uranus -- ╔═══╗ ┼────────────────────────╮ 狂狷 Origin:[ 狂 狷 年 少 ] whshs.cs.nccu.edu.tw ╰─╮ 年少 ┼╮ < IP:140.119.164.16 > ╰─╮ ╚╦═╦╝ From:218-171-139-38.dynamic.hinet.net ─╨─╨─ KGBBS 遨翔"BBS"的狂狷不馴;屬於年少的輕狂色彩 -- * Modify: tinlans 05/06/14 2:45:01 <218-171-139-38.dynamic.hinet.net>
FlyinDeath:原來是語意的關係... 218.162.232.47 06/14