C语言怎么实现多个值输出?

C语言中的函数为什么只能有一个返回值输出?怎么实现多个值输出?

C语言函数只能有一个输出,这是受当时编程方法的影响,是一个历史问题。在C语言发明前,大多数人还在用汇编语言的时候,编程效率底下,bug层出,维护困难。所以提出了一个革命性的思想,结构化程序设计,在这个思想下提出了编程函数化的理念,基于此出现了一系列的语言,C语言是其中一个发展最好的。

为何函数为何只有一个输出。其实都源于数学。数学的函数可以有多个变量,但只有一个结果。这其实是为了数学简单化。编程也是一样,这样的编程结果明确。所以现在函数式编程还是一个很火的理念。

但是,现实问题还是有很多不止一个输出结果的情况。好在c语言还留了一个后门。叫指针操作。通过指针操作你可以输出多个结果。这是C语言发展壮大的一个原因。也是现在C语言为人诟病的关键点。

现代编程语言大多抛弃了指针操作,但保留了多结果输出。不过函数式编程的理念也没有丢。也就是函数只有一个返回值,但这个返回值可以包含多个结果。

C语言的函数还真的只能有一个值返回,因为大部分情况下,我们不需要返回多个值,C语言规范中为了尽量避免程序设计的难度,就没有考虑函数的多个值的返回情况。即使有返回多个值的需求,也可以通过其它方式实现。

总结一下,大概有四种方式:

一. 传参数

通过指针或引用的方式可以在函数中改变传入参数的值。
例如在做两个数的交换时,如果用指针方式,如下:

void swap(int *a,int *b)
{
	int t=*a;
	*a=*b;
	*b=t;
}

采用引用的方式,如下

void swap(int &a,int *b)
{
	int t=a;
	a=b;
	b=t;
}

这样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;
}

返回tuple的类型,然后按下标获取对应的字段值即可。

三. 返回字符串

这种形式是将返回的多个字段作为字符串通过一些分隔符拼接起来作为整体返回,跟返回字符串数组差不多,只不过一个返回字符数组的形式要多一个拼接和分割操作,稍微麻烦一点,不过,在Java中这种方式用得比较多。

四. 返回结构体

直接定义一个结构体,这个结构体包含了所有要返回的值字段,类型可以不一样,但这样多定义了一个结构体,导致程序看起来比较冗余。

在C/C++语言中,虽然我们不能像Python那样直接返回多个值,但通过上面的四种方式实现多个值的返回,也基本上能满足需要。

你可能感兴趣的:(C语言怎么实现多个值输出?)