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

EzAMC


C语言的return语句只能返回一个返回值,要返回多个值,有以下办法:

1.返回数组(用指针)。前提条件是返回的多个数值具有相同的数据类型,不然也没法放到一个数组里面。

2.返回结构体。前提条件是这多个数据有一定的内在逻辑关系,不然强行定义一个结构体,把一堆不相干的数据放一起,即便语法上没问题,总觉得很别扭。

2也可以用指针。

3.通过函数参数来返回多个返回值。需要把函数参数定义为指针形式。

int Funtion(int param1,int param 2,int* p1,double* p2,.....)

上面这个函数,除了返回一个int,还能通过函数参数里面的两个指针p1,p2分别返回一个int和一个double。


simxpert


这是典型的C语言中函数模块中的返回值问题,算是常见的语法细节,很多人觉得C语言已经过时了,只能代表着这类人还不算是真正的技术人员,在嵌入式领域C语言依然充当着非常重要的角色,C语言在很多领域还是首选编程语言,主要在强调性能以及靠近硬件的编程中还是发挥着极其重要的作用,C语言常见的难点屈指可数,但组合起来使用难度会提升许多。

常见的C语言难点有指针,结构体,函数,递归,回调,数组等等,看起来没多少东西,每个概念都能延伸很多功能点,今天的题目其实就是函数模块中的返回值的问题,面向对象编程的基本单元就属于函数,函数包括参数输入,具体功能实现,最后是结果的输出,也就是这个题目的返回值,在正常情况下函数的返回值只有一个,但在实际编程中需要用到多个,在设计时候还是归结成一类,如果类型相近可以弄成数组方式,如果类型不太一致直接放在结构体中执行。

现在从语法规则出发列举几个实现多个值返回例子:

1.全局变量传递

这种方式算是最不科学的规范,打破了软件开发需要的闭环策略,但在基本语法上是支持的,C语言里面最好少涉猎全局变量,使用出错的风险会提升很多,真要想使用建议还是用静态全局变量直接在变量的前面加上static修饰符。

2.结构体指针返回

结构体是C语言涉及数据结构的最直接的容器,通常在编程过程中实现一个功能模块,模块中的数据通常都会放在一个结构体中,在在功能函数中对结构体中的数值进行操作,因为结构体中可以放足够多的变量,如果函数返回值是个指针的话,就能把整个结构体里面的内容返回出来,同样能够达到返回多个数值的作用,这种在平常的编程过程中用的最多,C语言中使用最频繁的关键点就是指针了,但也是很多初学者最不好理解的知识点。

C语言中如果掌握了结构体和指针基本上C语言将近一半的知识点就拿下了,当然直接返回结构体指针的方式属于非常常见的编程方式。

3.数组指针返回

指向数组的指针,既然是数组就可以在里面放入多个数值,同样可以起到返回多个数值的作用,其实这点和结构体指针效果差不多,只不过数值存放的位置不同。数组在C语言中用的也是非常多,数组在一定层面上其实和指针功能差不多,只不过在使用时候不如指针使用的灵活方便。

很多在刚开始学习C语言的初学者,因为项目经验不多,可能喜欢玩一些文字游戏,比如返回多个值的这样的题目,在实际项目中用的时候还是以实用为主,还要根据实际的情况,毕竟在实际项目中怎么去做选择的空间非常大,以稳定和实用为主。

希望能帮到你。


大学生编程指南


C语言中的函数就是只能有一个返回值输出啊,当初老外就是这么设计的,没办法!我知道,你是想通过一个函数返回多个值,因为你有这个需求嘛!那么干嘛一定要通过函数的返回值来获取多个输出呢?咱们换个方式不也行嘛!比如我要说的这个方式:C语言的结构体概念。且听我慢慢说来!


一、返回多个值的C程序需求

假设现在我有一个需求,需要定义一个C语言函数,这个函数的参数是一个正方形的边长,函数体是根据这个边长计算正方形的周长和面积,并且要把得到的周长和面积返回给C语言的main函数。

这个需求中就指定了这个函数要给C语言main函数返回两个值:一个是正方形的周长,一个是正方形的面积,该怎么返回呢?

二、使用C语言的结构体

C语言中的结构体概念想必大家都不会陌生,因为大家都被链表绕的云里雾里。今天咱不说链表,就说如何使用C语言的结构体来使得一个函数返回多个值。请看以下代码:

这是一段比较简单的C程序代码。其中我定义了一个函数:squrel。这个函数的参数包含两个,分别是:

  1. 整型变量length。这个就是正方形的边长,为了简单起见就定义为整型;

  2. 结构体指针pSquare。使用这个指针来保存C语言函数squrel计算出的周长和面积,并且返回给main函数;

可以看到,在C语言函数main中,我定义了一个结构体变量:square,它有两个成员:

  1. 整型变量circle。这是代表了正方形的周长;

  2. 整型变量area。这是代表了正方形的面积;

在函数squrel中,当我分别计算出了正方形的周长变量circle和面积变量area后,会把这两个变量给到C语言指针pSquare指向的square变量,也就是main函数中的square变量。

在main函数调用完squrel函数后,我们来看看变量square的两个成员的值分别是多少。运行结果如下:

啊!可行!函数squrel中计算出的两个变量顺利的成功的返回给了main函数!就算C语言函数只能返回一个值又怎样,照样有办法给main函数返回多个值。


不过除了使用结构体变量的形式可以得到函数的多个值以外,还可以使用数组哦,你知道怎么使用吗?


C语言编程答疑


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

一. 传参数

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

如果采用引用的方式,稍微改一下就好了,如下

这样a和b其实可以看成是要返回的两个值,这种通过指针和引用的方式一般是用得最多的多值返回方式。

二. 返回元组

当然我们可以以数组的形式值返回,即使类型不一样也没有关系,比如要返回三种类型的值,都将它们存入到一个string类型的数组里面,将每一个类型的值当成字符串存入,在使用时解析并转化一下类型就好了。

其实在C++11中就有tuple可以满足这个需求了,tuple中可以放不同类型的元素,并且在使用时也有对应方法获取变量值。例如

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

三. 返回字符串

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

四. 返回结构体

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

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


薛定谔的小猫猫


为什么只能有一个返回值?

从实现的角度讲: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.\

思考思考的动物


C语言函数只能有一个输出,这是受当时编程方法的影响。是一个历史问题。在C语言发明前,大多数人还在用汇编语言的时候,那真的是百花齐放,啥样都有。导致编程效率底下,bug层出,维护困难。所以有个大牛E.W.Dijikstra提出了一个革命性的思想,结构化程序设计。在这个思想下提出了编程函数化的理念。基于此出现了一系列的语言。C语言是其中一个发展最好的。就好像一个人生了一堆娃,其中一个当了总统。但总统也来自同一个基因。关于C语言为何脱颖而出发展壮大不是我们这里讨论的问题,就不深入讲了(讲下去可以写本书)。

我们就讲下为何函数为何只有一个输出。其实都源于数学。数学的函数可以有多个变量,但只有一个结果。这其实是为了数学简单化。编程也是一样。这样的编程结果明确,没有乱七八糟的网状关系。所以现在函数式编程还是一个很火的理念。

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

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


leang789


为什么?因为有c有强大的函数指针来做后盾,所以就不用返回那么多个值啦。



直接一个指针统统搞定。

1.用函数指针来传参

2.函数返回指针。

而这里的指针可以指向任何数据类型,你可以把你想要返回的数据封装到数组,结构体都可以。你开心就好。

欢迎关注我的头条,有很多编程技能总结。


极客IT视界


不是有结构体吗


BENZ9205904292


对于子函数,可以让数组名做函数参数,这样就可以返回整个数组。


风起松涛声


其实return那个返回一般用来校错的,功能型的返回一般在函数的参数里,只要把参数做成指针类型就可以了,返回结构体理论上可行,但是见得不多。


分享到:


相關文章: