-
1 # 極客程式視界
-
2 # leang789
C語言函式只能有一個輸出,這是受當時程式設計方法的影響。是一個歷史問題。在C語言發明前,大多數人還在用匯編語言的時候,那真的是百花齊放,啥樣都有。導致程式設計效率底下,bug層出,維護困難。所以有個大牛E.W.Dijikstra提出了一個革命性的思想,結構化程式設計。在這個思想下提出了程式設計函式化的理念。基於此出現了一系列的語言。C語言是其中一個發展最好的。就好像一個人生了一堆娃,其中一個當了總統。但總統也來自同一個基因。關於C語言為何脫穎而出發展壯大不是我們這裡討論的問題,就不深入講了(講下去可以寫本書)。
我們就講下為何函式為何只有一個輸出。其實都源於數學。數學的函式可以有多個變數,但只有一個結果。這其實是為了數學簡單化。程式設計也是一樣。這樣的程式設計結果明確,沒有亂七八糟的網狀關係。所以現在函數語言程式設計還是一個很火的理念。
但是,你不得不承認,現實問題還是有很多不止一個輸出結果的情況。好在c語言還留了一個後門。叫指標操作。透過指標操作你可以輸出多個結果。這是C語言發展壯大的一個原因。也是現在C語言為人詬病的關鍵點。
現代程式語言大多拋棄了指標操作,但保留了多結果輸出。不過函數語言程式設計的理念也沒有丟。也就是函式只有一個返回值,但這個返回值可以包含多個結果。
-
3 # 薛定諤的小貓貓
C語言的函式還真的只能有一個值返回,因為大部分情況下,我們不需要返回多個值,C語言規範中為了儘量避免程式設計的難度,就沒有考慮函式的多個值的返回情況。即使有返回多個值的需求,也可以透過其它方式實現。我總結一下,大概有四種方式
一. 傳引數
透過指標或引用的方式可以在函式中改變傳入引數的值,例如在做兩個數的交換時,如果用指標方式,可以像下面這樣寫
如果採用引用的方式,稍微改一下就好了,如下
這樣a和b其實可以看成是要返回的兩個值,這種透過指標和引用的方式一般是用得最多的多值返回方式。
二. 返回元組
當然我們可以以陣列的形式值返回,即使型別不一樣也沒有關係,比如要返回三種類型的值,都將它們存入到一個string型別的數組裡面,將每一個型別的值當成字串存入,在使用時解析並轉化一下型別就好了。
其實在C++11中就有tuple可以滿足這個需求了,tuple中可以放不同型別的元素,並且在使用時也有對應方法獲取變數值。例如
返回tuple的型別,然後按下標獲取對應的欄位值即可。
三. 返回字串
這種形式是將返回的多個欄位作為字串透過一些分隔符拼接起來作為整體返回,跟返回字串陣列差不多,只不過一個返回字元陣列的形式要多一個拼接和分割操作,稍微麻煩一點,不過,在Java中這種方式我用得比較多。
四. 返回結構體
即直接定義一個結構體,這個結構體包含了所有要返回的值欄位,型別可以不一樣,但這樣多定義了一個結構體,導致程式看起來比較冗餘。
在C/C++語言中,雖然我們不能像Python那樣直接返回多個值,但透過上面的四種方式實現多個值的返回,也基本上能滿足我們的需要。
-
4 # C語言答疑課堂
C語言中的函式就是隻能有一個返回值輸出啊,當初老外就是這麼設計的,沒辦法!我知道,你是想透過一個函式返回多個值,因為你有這個需求嘛!那麼幹嘛一定要透過函式的返回值來獲取多個輸出呢?咱們換個方式不也行嘛!比如我要說的這個方式:C語言的結構體概念。且聽我慢慢說來!
一、返回多個值的C程式需求假設現在我有一個需求,需要定義一個C語言函式,這個函式的引數是一個正方形的邊長,函式體是根據這個邊長計算正方形的周長和麵積,並且要把得到的周長和麵積返回給C語言的main函式。
這個需求中就指定了這個函式要給C語言main函式返回兩個值:一個是正方形的周長,一個是正方形的面積,該怎麼返回呢?
二、使用C語言的結構體C語言中的結構體概念想必大家都不會陌生,因為大家都被連結串列繞的雲裡霧裡。今天咱不說連結串列,就說如何使用C語言的結構體來使得一個函式返回多個值。請看以下程式碼:
這是一段比較簡單的C程式程式碼。其中我定義了一個函式:squrel。這個函式的引數包含兩個,分別是:
整型變數length。這個就是正方形的邊長,為了簡單起見就定義為整型;
結構體指標pSquare。使用這個指標來儲存C語言函式squrel計算出的周長和麵積,並且返回給main函式;
可以看到,在C語言函式main中,我定義了一個結構體變數:square,它有兩個成員:
整型變數circle。這是代表了正方形的周長;
整型變數area。這是代表了正方形的面積;
在函式squrel中,當我分別計算出了正方形的周長變數circle和麵積變數area後,會把這兩個變數給到C語言指標pSquare指向的square變數,也就是main函式中的square變數。
在main函式呼叫完squrel函式後,我們來看看變數square的兩個成員的值分別是多少。執行結果如下:
啊!可行!函式squrel中計算出的兩個變數順利的成功的返回給了main函式!就算C語言函式只能返回一個值又怎樣,照樣有辦法給main函式返回多個值。
不過除了使用結構體變數的形式可以得到函式的多個值以外,還可以使用陣列哦,你知道怎麼使用嗎?
-
5 # 思考思考的動物
為什麼只能有一個返回值?
從實現的角度講: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.", r.xs.x1, r.xs.x2);
return 0;
}
如果不能容納,則不能從返回值輸出。
注意:千萬不要將函式的本地變數的地址從函式返回,因為在函式呼叫結束時,期本地變數的生命週期也就結束了。雖然可以將全域性變數的地址從返回值返回,但沒有意義。不過可以將堆中的物件的地址從返回值返回,這也是 C#、Java、Python 等語言為什麼可以返回大型別值的原因。
◆可以換個思路,將多值從多個傳址引數輸出。例如:
#include <stdio.h>
void f(int* x1, int* x2){*x1 = 1;*x2 = 2;}
int main() {
int x1, x2;
f(&x1, &x2);
printf("x1=%d, x2=%d.", x1, x2);
return 0;
}
當需要輸出值太多時,可以考慮封裝在陣列或結構體中用一個傳址引數輸出。
-
6 # 大學生程式設計指南
這是典型的C語言中函式模組中的返回值問題,算是常見的語法細節,很多人覺得C語言已經過時了,只能代表著這類人還不算是真正的技術人員,在嵌入式領域C語言依然充當著非常重要的角色,C語言在很多領域還是首選程式語言,主要在強調效能以及靠近硬體的程式設計中還是發揮著極其重要的作用,C語言常見的難點屈指可數,但組合起來使用難度會提升許多。
常見的C語言難點有指標,結構體,函式,遞迴,回撥,陣列等等,看起來沒多少東西,每個概念都能延伸很多功能點,今天的題目其實就是函式模組中的返回值的問題,面向物件程式設計的基本單元就屬於函式,函式包括引數輸入,具體功能實現,最後是結果的輸出,也就是這個題目的返回值,在正常情況下函式的返回值只有一個,但在實際程式設計中需要用到多個,在設計時候還是歸結成一類,如果型別相近可以弄成陣列方式,如果型別不太一致直接放在結構體中執行。
現在從語法規則出發列舉幾個實現多個值返回例子:
1.全域性變數傳遞
這種方式算是最不科學的規範,打破了軟體開發需要的閉環策略,但在基本語法上是支援的,C語言裡面最好少涉獵全域性變數,使用出錯的風險會提升很多,真要想使用建議還是用靜態全域性變數直接在變數的前面加上static修飾符。
2.結構體指標返回
結構體是C語言涉及資料結構的最直接的容器,通常在程式設計過程中實現一個功能模組,模組中的資料通常都會放在一個結構體中,在在功能函式中對結構體中的數值進行操作,因為結構體中可以放足夠多的變數,如果函式返回值是個指標的話,就能把整個結構體裡面的內容返回出來,同樣能夠達到返回多個數值的作用,這種在平常的程式設計過程中用的最多,C語言中使用最頻繁的關鍵點就是指標了,但也是很多初學者最不好理解的知識點。
C語言中如果掌握了結構體和指標基本上C語言將近一半的知識點就拿下了,當然直接返回結構體指標的方式屬於非常常見的程式設計方式。
3.陣列指標返回
指向陣列的指標,既然是陣列就可以在裡面放入多個數值,同樣可以起到返回多個數值的作用,其實這點和結構體指標效果差不多,只不過數值存放的位置不同。陣列在C語言中用的也是非常多,陣列在一定層面上其實和指標功能差不多,只不過在使用時候不如指標使用的靈活方便。
很多在剛開始學習C語言的初學者,因為專案經驗不多,可能喜歡玩一些文字遊戲,比如返回多個值的這樣的題目,在實際專案中用的時候還是以實用為主,還要根據實際的情況,畢竟在實際專案中怎麼去做選擇的空間非常大,以穩定和實用為主。
-
7 # 成都茂大叔
那就要看你怎麼理解“值”的概念了,C語言的函式在呼叫時,其代表的是指向某個地址的指標,至於這個地址放的是什麼,你自己定義,但這個地址…你能把一個快遞同時發到兩個地址麼?
回覆列表
為什麼?因為有c有強大的函式指標來做後盾,所以就不用返回那麼多個值啦。
直接一個指標統統搞定。
1.用函式指標來傳參
2.函式返回指標。
而這裡的指標可以指向任何資料型別,你可以把你想要返回的資料封裝到陣列,結構體都可以。你開心就好。