推 FlyinDeath:原來是語意的關係... 218.162.232.47 06/14
※ 引述《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>