程式語言的發展很大的部分受人類正常思維方式的影響,在生活中,給一個輸入,有兩個輸出很常見,而大多數程式設計語言為什麼不這麼設計?
—————————————————————
不同程式設計語言因設計的不同支援1個或多個傳回值,故於2016—02—06更改問題。
回複內容:
python允許你幹多個傳回值的事情。然並卵,其實會包裹成一個tuple,加之tuple本來就可以原素綁定…其實這個問題也不是一句「返回一個資料結構」就可以清楚解決的。既然傳回值可以是一個資料結構,那麼參數其實也可以。
為什麼從C、Pascal這些古老的語言開始,參數就可以是多個,而傳回值卻是一個呢?這個問題值得探討一下。
假設我們設計了一個語言叫C-,函數的參數和傳回值都只能是一個,那麼在C-裡,一個多參數多傳回值的函數的定義和使用過程就是這樣的:
struct Para...;//define a parameter structstruct Ret...;//define a return structRet func(Para p){ ...}Para para = XXX;Ret ret;ret = func(para);
在runtime允許多值return並不是很有用,雖然看上去好像非常有用,如果這是一個必要的語言機制,那現在大多數語言就應該已經都支援了。如果你用過有這個功能的語言,比如Go,也多用來方便錯誤處理,它不一定要這麼用,但實際的代碼裡通常就是這樣
result, err := func()result, _ := func()
fork被你吃了?(ー`´ー)C裡調一個指標或者結構體指標,你想返回多少都行,只要記憶體夠。請看Lua,函數參數可多可少,傳回值可多可少,接收傳回值也是可多可少。流行得比較早的語言,比如pascal和c,都只有一個返回比較簡單類型的傳回值,這可能是為了把傳回值放到某寄存器中返回,這樣調用者可以直接用,有利於提高程式的速度。過去cpu是很慢的,這種最佳化很有價值。
c++大概是繼承了c,所以只有一個i傳回值。java從文法上模仿c++,所以也只有一個傳回值。
設計一個多個傳回值的語言,並不困難。golang就是一個。個人理解,多傳回值的函數一定可以通過多個單傳回值的函數來實現。對於早起的語言設計者而言,這應該是一個錦上添花而不是必須的功能,優先順序不高。
當然,後來的語言,很多已經實現了這個功能,因為畢竟不難
ps,說通過指標在參數裡傳遞的,可以退散了,不是一個問題好吧。現代程式設計語言中「函數」概念多來自 ALGOL 和 Fortran
ALGOL 和 Fotrean 的概念借自數學
數學函數有多元之說,然而你見過幾個「多傳回值」的?這是一個好問題。為什麼函數只返回一個值。這是儲存和計算的一種統一。一個沒有副作用的函數,返回一個值,那他在使用上其實是可以看做一個變數,一個有條件的變數,可以很好的簡化程式。