C語言中的函數為什麼只能有一個返回值輸出?怎麼實現多個值輸出?

EzAMC


C語言的函數還真的只能有一個值返回,因為大部分情況下,我們不需要返回多個值,C語言規範中為了儘量避免程序設計的難度,就沒有考慮函數的多個值的返回情況。即使有返回多個值的需求,也可以通過其它方式實現。我總結一下,大概有四種方式

一. 傳參數

通過指針或引用的方式可以在函數中改變傳入參數的值,例如在做兩個數的交換時,如果用指針方式,可以像下面這樣寫

如果採用引用的方式,稍微改一下就好了,如下

這樣a和b其實可以看成是要返回的兩個值,這種通過指針和引用的方式一般是用得最多的多值返回方式。

二. 返回元組

當然我們可以以數組的形式值返回,即使類型不一樣也沒有關係,比如要返回三種類型的值,都將它們存入到一個string類型的數組裡面,將每一個類型的值當成字符串存入,在使用時解析並轉化一下類型就好了。

其實在C++11中就有tuple可以滿足這個需求了,tuple中可以放不同類型的元素,並且在使用時也有對應方法獲取變量值。例如

返回tuple的類型,然後按下標獲取對應的字段值即可。

三. 返回字符串

這種形式是將返回的多個字段作為字符串通過一些分隔符拼接起來作為整體返回,跟返回字符串數組差不多,只不過一個返回字符數組的形式要多一個拼接和分割操作,稍微麻煩一點,不過,在Java中這種方式我用得比較多。

四. 返回結構體

即直接定義一個結構體,這個結構體包含了所有要返回的值字段,類型可以不一樣,但這樣多定義了一個結構體,導致程序看起來比較冗餘。

在C/C++語言中,雖然我們不能像Python那樣直接返回多個值,但通過上面的四種方式實現多個值的返回,也基本上能滿足我們的需要。


薛定諤的小貓貓


這是典型的C語言中函數模塊中的返回值問題,算是常見的語法細節,很多人覺得C語言已經過時了,只能代表著這類人還不算是真正的技術人員,在嵌入式領域C語言依然充當著非常重要的角色,C語言在很多領域還是首選編程語言,主要在強調性能以及靠近硬件的編程中還是發揮著極其重要的作用,C語言常見的難點屈指可數,但組合起來使用難度會提升許多。

常見的C語言難點有指針,結構體,函數,遞歸,回調,數組等等,看起來沒多少東西,每個概念都能延伸很多功能點,今天的題目其實就是函數模塊中的返回值的問題,面向對象編程的基本單元就屬於函數,函數包括參數輸入,具體功能實現,最後是結果的輸出,也就是這個題目的返回值,在正常情況下函數的返回值只有一個,但在實際編程中需要用到多個,在設計時候還是歸結成一類,如果類型相近可以弄成數組方式,如果類型不太一致直接放在結構體中執行。

現在從語法規則出發列舉幾個實現多個值返回例子:

1.全局變量傳遞

這種方式算是最不科學的規範,打破了軟件開發需要的閉環策略,但在基本語法上是支持的,C語言裡面最好少涉獵全局變量,使用出錯的風險會提升很多,真要想使用建議還是用靜態全局變量直接在變量的前面加上static修飾符。

2.結構體指針返回

結構體是C語言涉及數據結構的最直接的容器,通常在編程過程中實現一個功能模塊,模塊中的數據通常都會放在一個結構體中,在在功能函數中對結構體中的數值進行操作,因為結構體中可以放足夠多的變量,如果函數返回值是個指針的話,就能把整個結構體裡面的內容返回出來,同樣能夠達到返回多個數值的作用,這種在平常的編程過程中用的最多,C語言中使用最頻繁的關鍵點就是指針了,但也是很多初學者最不好理解的知識點。

C語言中如果掌握了結構體和指針基本上C語言將近一半的知識點就拿下了,當然直接返回結構體指針的方式屬於非常常見的編程方式。

3.數組指針返回

指向數組的指針,既然是數組就可以在裡面放入多個數值,同樣可以起到返回多個數值的作用,其實這點和結構體指針效果差不多,只不過數值存放的位置不同。數組在C語言中用的也是非常多,數組在一定層面上其實和指針功能差不多,只不過在使用時候不如指針使用的靈活方便。

很多在剛開始學習C語言的初學者,因為項目經驗不多,可能喜歡玩一些文字遊戲,比如返回多個值的這樣的題目,在實際項目中用的時候還是以實用為主,還要根據實際的情況,畢竟在實際項目中怎麼去做選擇的空間非常大,以穩定和實用為主。

希望能幫到你。


大學生編程指南


C語言中的函數就是隻能有一個返回值輸出啊,當初老外就是這麼設計的,沒辦法!我知道,你是想通過一個函數返回多個值,因為你有這個需求嘛!那麼幹嘛一定要通過函數的返回值來獲取多個輸出呢?咱們換個方式不也行嘛!比如我要說的這個方式:C語言的結構體概念。且聽我慢慢說來!


一、返回多個值的C程序需求

假設現在我有一個需求,需要定義一個C語言函數,這個函數的參數是一個正方形的邊長,函數體是根據這個邊長計算正方形的周長和麵積,並且要把得到的周長和麵積返回給C語言的main函數。

這個需求中就指定了這個函數要給C語言main函數返回兩個值:一個是正方形的周長,一個是正方形的面積,該怎麼返回呢?

二、使用C語言的結構體

C語言中的結構體概念想必大家都不會陌生,因為大家都被鏈表繞的雲裡霧裡。今天咱不說鏈表,就說如何使用C語言的結構體來使得一個函數返回多個值。請看以下代碼:

這是一段比較簡單的C程序代碼。其中我定義了一個函數:squrel。這個函數的參數包含兩個,分別是:

  1. 整型變量length。這個就是正方形的邊長,為了簡單起見就定義為整型;

  2. 結構體指針pSquare。使用這個指針來保存C語言函數squrel計算出的周長和麵積,並且返回給main函數;

可以看到,在C語言函數main中,我定義了一個結構體變量:square,它有兩個成員:

  1. 整型變量circle。這是代表了正方形的周長;

  2. 整型變量area。這是代表了正方形的面積;

在函數squrel中,當我分別計算出了正方形的周長變量circle和麵積變量area後,會把這兩個變量給到C語言指針pSquare指向的square變量,也就是main函數中的square變量。

在main函數調用完squrel函數後,我們來看看變量square的兩個成員的值分別是多少。運行結果如下:

啊!可行!函數squrel中計算出的兩個變量順利的成功的返回給了main函數!就算C語言函數只能返回一個值又怎樣,照樣有辦法給main函數返回多個值。


不過除了使用結構體變量的形式可以得到函數的多個值以外,還可以使用數組哦,你知道怎麼使用嗎?


C語言編程答疑


為什麼只能有一個返回值?

從實現的角度講:C函數被編譯後,其返回值被存在1或2個寄存器中,由於寄存器位數有限,只能容納單個整數、小數、指針、布爾,這樣的大小固定的小類型的值,對於多個這些類型的值 的排列組合:數組、結構體、等,就無能為力了。

從數學的角度看:函數f:X→Y,就是集合X到集合Y的映射,給定任意x∈X,有唯一的y=f(x)∈Y與之對應。也就是說數學上函數只能有一個參數,一個返回值,但參數和返回值的類型任意。

多元函數 z=f(x,y), x∈X, y∈Y, z∈Z,數學上,有兩種解釋:

◇可解釋為X和Y的卡氏積到Z的函數,即,f:X×Y→Z;

◇可解釋為X在Z上的作用,即,f:X→(Y→Z)。

C語言繼承了數學上的規定:

◆沒有參數或返回值,C用void集合表示,即,void f(void);

◆多元函數,C採用第一種數學上的解釋(絕大數計算機語言採用第一種解釋,Hakell採取第二種);

◆函數只能有一個返回值。

如何實現多值輸出?

◆硬要從返回值輸出多值:

如果多個值可以組合為寄存器可以容納的返回類型的值,則返回組合後的值就可以了。例如:

#include <stdio.h>

struct r { union {

int x;

struct { int x1 : 8; int x2 : 8; } xs;

}; };

int f() {

struct r r;

r.xs.x1 = 1; r.xs.x2 = 2;

return r.x;

}

int main() {

struct r r;

r.x = f();

printf("x1=%d, x2=%d.\

思考思考的動物


C語言函數只能有一個輸出,這是受當時編程方法的影響。是一個歷史問題。在C語言發明前,大多數人還在用匯編語言的時候,那真的是百花齊放,啥樣都有。導致編程效率底下,bug層出,維護困難。所以有個大牛E.W.Dijikstra提出了一個革命性的思想,結構化程序設計。在這個思想下提出了編程函數化的理念。基於此出現了一系列的語言。C語言是其中一個發展最好的。就好像一個人生了一堆娃,其中一個當了總統。但總統也來自同一個基因。關於C語言為何脫穎而出發展壯大不是我們這裡討論的問題,就不深入講了(講下去可以寫本書)。

我們就講下為何函數為何只有一個輸出。其實都源於數學。數學的函數可以有多個變量,但只有一個結果。這其實是為了數學簡單化。編程也是一樣。這樣的編程結果明確,沒有亂七八糟的網狀關係。所以現在函數式編程還是一個很火的理念。

但是,你不得不承認,現實問題還是有很多不止一個輸出結果的情況。好在c語言還留了一個後門。叫指針操作。通過指針操作你可以輸出多個結果。這是C語言發展壯大的一個原因。也是現在C語言為人詬病的關鍵點。

現代編程語言大多拋棄了指針操作,但保留了多結果輸出。不過函數式編程的理念也沒有丟。也就是函數只有一個返回值,但這個返回值可以包含多個結果。


leang789


C語言的return語句只能返回一個返回值,要返回多個值,有以下辦法:

1.返回數組(用指針)。前提條件是返回的多個數值具有相同的數據類型,不然也沒法放到一個數組裡面。

2.返回結構體。前提條件是這多個數據有一定的內在邏輯關係,不然強行定義一個結構體,把一堆不相干的數據放一起,即便語法上沒問題,總覺得很彆扭。

2也可以用指針。

3.通過函數參數來返回多個返回值。需要把函數參數定義為指針形式。

int Funtion(int param1,int param 2,int* p1,double* p2,.....)

上面這個函數,除了返回一個int,還能通過函數參數裡面的兩個指針p1,p2分別返回一個int和一個double。


simxpert


為什麼?因為有c有強大的函數指針來做後盾,所以就不用返回那麼多個值啦。



直接一個指針統統搞定。

1.用函數指針來傳參

2.函數返回指針。

而這裡的指針可以指向任何數據類型,你可以把你想要返回的數據封裝到數組,結構體都可以。你開心就好。

歡迎關注我的頭條,有很多編程技能總結。


極客IT視界


不是有結構體嗎


BENZ9205904292


可以啊,返回指針。


沙漠鼠標


對於子函數,可以讓數組名做函數參數,這樣就可以返回整個數組。


分享到:


相關文章: