有那么一種情況,函數(shù)本身需要返回多個(gè)值,如在地圖參數(shù)中需要返回二維坐標(biāo)(x,y),或者是系統(tǒng)設(shè)計(jì)中需要返回一個(gè)學(xué)生多門課程的成績(jī)。這里提供了一些做法和思路。
1. 全局變量,為什么不用它?
如,這樣的方法,當(dāng)我們需要通過(guò)函數(shù)對(duì)多個(gè)值進(jìn)行返回和傳遞的時(shí)候,可以使用一種弄虛作假的方式,就是使用全局變量,不需要函數(shù)返回,只需要在關(guān)鍵時(shí)刻進(jìn)行設(shè)置就可以了。
int x,y; void getWay(int a,int b){ x=a,y=b; } int main(){ getWay(10,20); cout<<x<<" "<<y<<endl; return 0; }
這是在自欺欺人,對(duì),當(dāng)我們需要多個(gè)值進(jìn)行返回傳遞的時(shí)候,我們可以使用全局變量避免掉這個(gè)設(shè)計(jì),但這并不能解決核心問(wèn)題,使用全局變量當(dāng)我們需要多次調(diào)用或者遞歸調(diào)用函數(shù)時(shí)則會(huì)出現(xiàn)諸如數(shù)據(jù)紊亂等的錯(cuò)誤,而且一旦在工程中使用大量的全局變量,則會(huì)造成很多意外的后果,因此這里不過(guò)多討論。
2. 雙返回值,pair
在我們學(xué)習(xí)pair一對(duì)數(shù)據(jù)的時(shí)候我們就有了解,我們可以通過(guò)pair作為數(shù)據(jù)類型進(jìn)行多組數(shù)據(jù)的傳遞,這往往對(duì)于兩個(gè)數(shù)據(jù)(較少的數(shù)據(jù))而言,是最理想的情況。
pair<string,int> getClass(int id){ return make_pair("DOTCPP!",id); } int main(int argc,char **argv){ pair<string,int> a; a=getClass(10); cout<<a.first<<" "<<a.second<<endl; return 0; }
3. 指針?lè)祷胤?/span>
指針?lè)祷胤ǎㄓ置麛?shù)組返回法)顧名思義,我們的數(shù)據(jù)類型使用的是一個(gè)指針類型的數(shù)組作為返回類型,其返回的內(nèi)容在內(nèi)存空間上是連貫的,這個(gè)方法也被用來(lái)進(jìn)行常規(guī)的數(shù)組作為參數(shù)的返回。
#include<iostream> using namespace std; int *getWay(int n){ int *p=new int[3]; p[0]=n+10; p[1]=n+20; p[2]=n+30; return p; } int main(){ int *res = getWay(10); for(int i=0;i<3;i++){ cout<<res[i]<<' '; } delete []p;//防止內(nèi)存泄漏 return 0; }
4.結(jié)構(gòu)體返回法
這個(gè)是對(duì)于超過(guò)兩個(gè)元素的最推薦的寫(xiě)法了,對(duì)于指針?lè)祷胤ǎ涫窍喈?dāng)于把多組的數(shù)據(jù)當(dāng)成一個(gè)共同類型的參數(shù)作為處理,可一旦返回的元素同時(shí)有整形又有浮點(diǎn)型這樣不同的元素,指針?lè)祷氐姆椒ㄍ筒惶m用了,最理想的方式還是設(shè)計(jì)結(jié)構(gòu)體,使用結(jié)構(gòu)體返回法。
#include<iostream> using namespace std; struct ans { int a; char b; double c; }; ans getWay(int n){ struct ans r_ans; r_ans.a=n; r_ans.b=n; r_ans.c=n+0.11; return r_ans; } int main(){ ans ans = getWay(97); cout<<ans.a<<' '<<ans.b<<' '<<ans.c<<endl; return 0; } //output: //97 a 97.11
這樣有點(diǎn)類似于在第二第三章所學(xué)的數(shù)據(jù)結(jié)構(gòu)定義的內(nèi)容,事實(shí)上的確是相通的,函數(shù)多返回值是C/C++設(shè)計(jì)上所缺失的,也由于時(shí)代原因當(dāng)時(shí)的設(shè)計(jì)不需要考慮如今那么多,而如今的各種新型語(yǔ)言均支持了這個(gè)概念,直接使用逗號(hào)進(jìn)行分割即可達(dá)到效果。
5. 眼饞一下,看看PYTHON的寫(xiě)法
def getWay(n): a=n b=chr(n) c=n+0.11 return a,b,c x,y,z=getWay(97) print(x,y,z)
沒(méi)錯(cuò),這樣就完成了本章第五點(diǎn)C++中花大篇幅介紹的功能,C語(yǔ)言網(wǎng)Dotcpp已經(jīng)上線Python編譯器,允許各位使用Python答題,歡迎大家使用。
C語(yǔ)言網(wǎng)提供由在職研發(fā)工程師或ACM藍(lán)橋杯競(jìng)賽優(yōu)秀選手錄制的視頻教程,并配有習(xí)題和答疑,點(diǎn)擊了解:
一點(diǎn)編程也不會(huì)寫(xiě)的:零基礎(chǔ)C語(yǔ)言學(xué)練課程
解決困擾你多年的C語(yǔ)言疑難雜癥特性的C語(yǔ)言進(jìn)階課程
從零到寫(xiě)出一個(gè)爬蟲(chóng)的Python編程課程
只會(huì)語(yǔ)法寫(xiě)不出代碼?手把手帶你寫(xiě)100個(gè)編程真題的編程百練課程
信息學(xué)奧賽或C++選手的 必學(xué)C++課程
藍(lán)橋杯ACM、信息學(xué)奧賽的必學(xué)課程:算法競(jìng)賽課入門課程
手把手講解近五年真題的藍(lán)橋杯輔導(dǎo)課程