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