C語言函數(shù)只能有一個輸出,這是受當時編程方法的影響,是一個歷史問題。在C語言發(fā)明前,大多數(shù)人還在用匯編語言的時候,編程效率底下,bug層出,維護困難。所以提出了一個革命性的思想,結(jié)構(gòu)化程序設計,在這個思想下提出了編程函數(shù)化的理念,基于此出現(xiàn)了一系列的語言,C語言是其中一個發(fā)展最好的。
為何函數(shù)為何只有一個輸出。其實都源于數(shù)學。數(shù)學的函數(shù)可以有多個變量,但只有一個結(jié)果。這其實是為了數(shù)學簡單化。編程也是一樣,這樣的編程結(jié)果明確。所以現(xiàn)在函數(shù)式編程還是一個很火的理念。
但是,現(xiàn)實問題還是有很多不止一個輸出結(jié)果的情況。好在c語言還留了一個后門。叫指針操作。通過指針操作你可以輸出多個結(jié)果。這是C語言發(fā)展壯大的一個原因。也是現(xiàn)在C語言為人詬病的關(guān)鍵點。
現(xiàn)代編程語言大多拋棄了指針操作,但保留了多結(jié)果輸出。不過函數(shù)式編程的理念也沒有丟。也就是函數(shù)只有一個返回值,但這個返回值可以包含多個結(jié)果。
C語言的函數(shù)還真的只能有一個值返回,因為大部分情況下,我們不需要返回多個值,C語言規(guī)范中為了盡量避免程序設計的難度,就沒有考慮函數(shù)的多個值的返回情況。即使有返回多個值的需求,也可以通過其它方式實現(xiàn)。
總結(jié)一下,大概有四種方式:
一.傳參數(shù)
通過指針或引用的方式可以在函數(shù)中改變傳入?yún)?shù)的值。
例如在做兩個數(shù)的交換時,如果用指針方式,如下:
voidswap(int*a,int*b)
{
intt=*a;
*a=*b;
*b=t;
}
1
2
3
4
5
6
1
2
3
4
5
6
采用引用的方式,如下
voidswap(int&a,int*b)
{
intt=a;
a=b;
b=t;
}
1
2
3
4
5
6
1
2
3
4
5
6
這樣a和b其實可以看成是要返回的兩個值,這種通過指針和引用的方式一般是用得最多的多值返回方式。
二.返回元組
當然我們可以以數(shù)組的形式值返回,即使類型不一樣也沒有關(guān)系,比如要返回三種類型的值,都將它們存入到一個string類型的數(shù)組里面,將每一個類型的值當成字符串存入,在使用時解析并轉(zhuǎn)化一下類型就好了。
其實在C++11中就有tuple可以滿足這個需求了,tuple中可以放不同類型的元素,并且在使用時也有對應方法獲取變量值。例如:
tuple<int,string,double>getTuple()
{
intx=1;
stringy="hello";
doublez=2.0;
returnmake_tuple(x,y,z);
}
intmain()
{
autot=getTuple();
intx=get<0>(t);
stringy=get<1>(t);
doublez=get<2>(t);
cout<<"x="<<x<<endl
<<"y="<<y<<endl
<<"z="<<z<<endl;
return0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
返回tuple的類型,然后按下標獲取對應的字段值即可。
三.返回字符串
這種形式是將返回的多個字段作為字符串通過一些分隔符拼接起來作為整體返回,跟返回字符串數(shù)組差不多,只不過一個返回字符數(shù)組的形式要多一個拼接和分割操作,稍微麻煩一點,不過,在Java中這種方式用得比較多。
四.返回結(jié)構(gòu)體
直接定義一個結(jié)構(gòu)體,這個結(jié)構(gòu)體包含了所有要返回的值字段,類型可以不一樣,但這樣多定義了一個結(jié)構(gòu)體,導致程序看起來比較冗余。
在C/C++語言中,雖然我們不能像Python那樣直接返回多個值,但通過上面的四種方式實現(xiàn)多個值的返回,也基本上能滿足需要。
打開CSDN,閱讀體驗更佳