通俗地講為何要有返回值?

時間 2021-05-07 00:27:56

1樓:GangChen

函式本身就是給定產量輸出值的。y=f(x)這樣子,這才是函式一開始的解釋吧,它的作用在於計算。

你說的輸出到輸出變數,我之前學硬體的時候學過一門硬體上面的程式語言好像就是指定in和out的,但是那個已經做了超過計算的事情了。因為你不僅做了計算,還特麼做了賦值到變數的操作。相對於稱之為函式,我更傾向於稱之為模組。

而且啊,cpp完全可以做到類似功能,傳個引用就可以了,但是也沒見人這麼寫,說明大家還是更傾向於寫返回值啊。

2樓:chenc

行是行的,只是不好。

返回值可以直接用在表示式裡,不用返回值就要多一行,先呼叫,再把返回值放到表示式裡來,如果變數沒有定義那就還要定義乙個變數。

表示式裡如果需要呼叫多個函式,那就多了好多行。

這實在是很愚蠢的做法。

3樓:四月的少年

如果沒有返回值,那我做乙個計算的時候,計算到一半,發現滿足我想要的答案的時候怎麼辦?

如果沒有返回值,老師點你的名字明明都點到了,卻還要繼續往下念,你會不會覺得老師是個神經病?

4樓:Doraemon

因為在程式表達上,使用返回值的形式比定義輸出引數要更直觀。想象一下doublea=

sin(PI/

2);printf

("sin(PI/2)=%lf\n"

,a);和

doublea;

sin(PI/

2,&a

);printf

("sin(PI/2)=%lf\n"

,a);很明顯前者更直觀也更通俗易懂。

而且定義返回值的話,可以直接把函式呼叫語句作為另乙個函式的引數使用,而如果使用輸出引數,就必須要先定義乙個用作輸出的變數,靈活性下降。比如,第乙個例子可以寫成這樣:

printf

("sin(PI/2)=%lf\n"

,sin(PI

/2));在 printf 函式裡面巢狀乙個 sin 函式。

最後一點就是,如果使用輸出變數的話,由於使用指標傳遞,會引起一些不可預料的錯誤,比如修改了 const 變數的值等等。

5樓:

如果你是領導,你交代給下屬任務,他完成了要不要給你回句話~

如果這份任務是寫乙份報告,要不要給你提交上來,明天開會還等著用呢~

6樓:

這問題蠻有趣的,隨便說兩句,沒法太嚴謹。

計算機有三種等價的理論模型:圖靈機、λ演算、一般遞迴函式。這三個模型中,後兩種都可以看作是由「有輸入引數和輸出引數的函式」生成的。

程式語言自然參考了這三種模型。對於圖靈機來說,它更偏向硬體,馮諾依曼結構和哈佛結構都很像圖靈機,所以程式語言更多的是用它來設計面向硬體的部分。但是,偏硬體的東西抽象程度不會太高,和人類的思維方式也不怎麼吻合。

所以到具體程式設計的時候,大家更希望用後兩種模型。於是程式語言越接近程式設計師的那一層就越像後兩種模型,不管什麼程式語言都有類似「有輸入引數和輸出引數的函式」的概念。(當然程式語言還參雜了各種其它思想,但在計算上應該沒有其它模型)

7樓:秩序教長

跟之前某些答主的說法正好相反

返回值的作用是讓你可以有選擇的接受函式輸出你可以選擇拿乙個變數去接收它,也可以不接收就好像函式的過載或者預設引數一樣,你既然可以選擇是否輸入,你也應可以選擇是否輸出

在一般情況下,輸出引數和返回值之間的區別只是初始化的區別,你可以選擇先造乙個變數然後給函式初始化,也可以選擇造變數的同時初始化,後者更符合人類思路

8樓:Cyandev

引數做返回值當然可以,C 想返回多值還必須用 out 引數呢。但 PL 不就是為了讓程式更好寫麼。為什麼這麼多語言開始支援元組?

照題主的思路,for、while 都不需要了,直接用 if、goto 就能實現。哦,對了,類也不需要,struct 足矣,反正函式裡把 this 當指標傳進去就行。

你說說我們為什麼要用這種智障 PL?

9樓:花貓呀

如果只看c 語言的話,實參能傳遞給形參,但形參不能返回實參,這是值傳遞,在這種情況下,有返回值是必要的,但如果是位址傳遞,用指標,陣列可以間接的實現主調函式與被調函式之間的數值傳遞,此時可無返回值,其實,你要具體分析這個問題,看簡單解決這個問題的話,需不需要返回值,以及有沒有必要

10樓:yyl

要用返回值還是要用輸出引數,取決於你要做什麼,以及你的設計模式是什麼。如果你想做到getPerson().getEyes().

getEyebow().getLength() 這樣的行文,那你就用返回值。如果你要

If (getPerson(p) == successful)If (p.getEyes(e) == successful)Else print ("failed to get eyes") //並且根據返回值決定該幹嘛

Else print ("failed to get person") //並且根據返回值決定該幹嘛

那就輸出引數。

11樓:

都是胡說八道。

程式語言有何發展過程,不是現在看上蠢不蠢的問題。早在幾十年前,面向過程的時候就已經定了。函式和方法。

乙個有返回值乙個沒返回值。之後再發展到方法可以返回數值,再發展到函式可以作為引數都是一步一步的過程。

計算機語言是乙個過程,並且需要向下相容。

12樓:傳話員

隨便來一段感受一下就知道了

比如y=f(g(x))+g(f(x))

沒有返回值的話就得寫成

g(x,a);

f(a,b);

f(x,m);

g(m,n);

y=b+n;

13樓:金小胖

我想知道1+1等於幾,於是我和你說,給我計算一下1+1,我急著要。

然後你現在我面前說了句好,然後你說算完了。

所以你覺得為什麼需要返回值?

14樓:東山閒雲

上古 tubro passc程式設計師路過.過程與函式一章講的很清楚,都是子程式,過程無返回值,函式有返回值,一般來說函式用於表示式,所以要返回值。函式不能作為單獨語句,過程可以。

15樓:等待的詩書

返回是要返回到上一次的function call.

如果你能乙個function幹完所有的事,那就沒必要有return value了。

16樓:Nothing

如果是輸出變數的話,這個結果只能使用一次,就是說這個被調函式結束後,這個結果也就沒了。

然後如果你要計算a*b,就用mul(a,b),看似也沒有問題但是當你需要計算c*(a+b),問題就來了,因為你沒有辦法去獲得a+b的結果去跟c做乘法。

也就是說你沒發將這兩個函式管理起來。

但是如果有返回值的話,你就可以這麼操作

cout<推廣一下,函式之間的互相作用就是通過返回值來實現的,否則你所有的函式的計算結果一般都是區域性變數,除非你全部放棄函式所有的寫在主函式中。或者是全部全域性變數。

17樓:two tigers

打個比方,你到餐館,點了個菜。就說叫酸菜魚吧。

然後後廚拼命的衝你喊,新鮮草魚,味道鮮美,加上酸菜,製作出一道美味的酸菜魚。

然後給你上了乙個空盤子。

空盤子就是你的返回值 →_→

18樓:池龍

技術上來說當然可以,但是這樣的話,等你要在乙個函式的引數裡使用另乙個函式的計算結果的時候,就只能使用乙個中間變數了。

你不覺得這麼寫很麻煩嗎?

19樓:鍵山怜奈

其實二者沒有區別啊,一般的引數是呼叫方可以寫入,函式方可以讀寫;返回值是呼叫方可以讀取,函式方可以寫入。只是限制不同而已,你高興的話乙個引數不用返回值也別用全都用全域性變數傳遞好了。如果全域性變數滿足不了你那你還可以直接操作記憶體乃至硬碟傳遞引數

20樓:

首先說一下什麼叫函式三要素。對比來說,定義乙個變數,你寫x,是沒用的,編譯器會報錯,必須寫int x或者char x或者balabala,隨便你啦;定義乙個陣列,arr也沒用,arr[10]還是沒用,得int arr[10]才行,所以陣列有兩個要素;而函式,就有三個要素,你要定義乙個函式,就得把這三個要素都寫出來,才能讓編譯器明白你定義了乙個函式,這個函式的函式名是fun,輸入引數是int型,返回值也是int型(也就是int fun(int ))。

所以其實,返回值是必須的,你什麼也不返回,其實也是返回了void,而輸出引數並不是必須的,就算要問,我覺得也應該問為什麼需要輸出引數而不是問為什麼需要返回值。當你定義乙個函式的時候,你就同時定義了它的返回值,否則你也無法定義乙個函式。

所以先弄清楚主次問題,退一步說,就算將輸出引數放在返回值的位置,也是輸出引數的說法變成返回值,而不是把返回值稱呼成輸出引數。

但其實這個退一步的說法是不成立的,下面來說一下我自己理解的返回值和輸出引數的區別。

先說輸出引數。所謂輸出引數,其實是依賴於輸入引數的,輸入了指標變數,才能有所謂的輸出引數(而返回值不需要,返回值就是函式本身的要素)。輸出引數是怎麼實現的?

假設在main函式裡面定義了乙個指標變數int *p,並且將p作為輸入引數傳遞給函式fun,然後本來*p = 10,在fun裡面將*p改成5,大體上的實現如下圖

首先記憶體給每個函式都開闢了屬於自己的儲存空間,main有main的,fun有fun的,這也是為什麼直接在fun中修改輸入引數沒有用,因為輸入引數的傳遞是乙個拷貝的過程,我認為理解這一點十分十分重要。

首先程式從main函式開始,執行到main中的fun(p),(圖中忘記寫輸入引數了)然後跳轉到fun函式(①②)。首先,main中一定開闢了乙個空間儲存指標p,還開闢了乙個空間儲存*p,也就是10,但是fun的輸入引數是p,所以拷貝的其實只有p,仔細看方框B,也就是fun的儲存空間中,是沒有給*p分配空間的!當fun執行到*p = 5;這條語句的時候,修改的,是main中*p的值,所以實際上,沒有什麼輸出,輸出引數這個名字我覺得本身就有很強的誤導性,它是通過指標直接修改的。

真正能夠輸出的我認為反而是返回值。

返回值是怎麼輸出的呢?跟輸入引數一樣,拷貝輸出。既然是拷貝,複製貼上大家都用過,複製,肯定就有兩份,fun裡面有返回值,main裡面肯定也給返回值分配了空間,只是當fun執行完return語句後,就會立刻結束自己,也就是PC指標會指回main函式中,並且原本分配給fun的空間也被釋放(也就是方框B不存在了,裡面的資料也不存在了),返回值就這麼被拷貝到了main函式中。

所以實際上,所謂的輸出引數其實並不是輸出的,而返回值才算輸出的。這也是為什麼我一開始不太理解什麼叫做用輸出引數替換返回值的原因,我覺得,輸出引數不就是返回值嗎......

如何通俗地講禪?

林凡 何名禪定,外離相為禪,內不亂為定 六祖壇經 人性本具佛性,把佛性以外的感受 思維 情緒去掉,佛性即展現出來,套用一句雞湯的話,把仇恨 恐懼 煩惱 習氣等等全部去掉,就只剩下愛了。禪是佛教修行的法門之一,為什麼要修,要看你修行的目的是什麼了。如何修,禪是對心的訓練,觀心,把不符合的心念去掉,讓心...

通俗的講一講什麼是理財?

迎春花開ychk 真正的理財,永遠用時間換取增值的空閘,用閒錢慢慢累積財富。理財的目標首先是改善生活,即使不工作時,依然能有收入,所以理財並不是讓你一次性掙到很多錢,而是讓你擁用持續的被動收入 安全,持續,是重點! 小土賊吖 理 管理,財 經濟物質。理財對於平常人通俗講就是管理資金,固產等。既然是管...

緩刑是什麼 通俗點講?

sz7701 緩刑就是給罪犯乙個機會,只要緩刑期間不違法,老老實實聽話,那麼前面的實體刑不再執行。不過不是所有的緩刑都不用坐牢,有乙個例外 死緩,也就是死刑,緩期兩年執行,這是一定要收監的,然後只要在這兩年期間不觸犯刑法就自動轉為無期徒刑。不管什麼緩刑,一旦判決,公務員或事業單位的飯碗就被砸了,這是...