函数为什么只有一个返回值?

longshanks 2007-08-02 03:41:16
在marrco2005 (高手前传)的帖子《在C++中,为什么构造函数不能有返回值?》中,我们热烈地讨论了一番。我获益不少。
这倒让我想起了另一个问题:为什么函数不能返回多个值?
很多语言都是这样。难道冥冥之中有个看不见的大手操纵着这一切吗?
我知道,数学中的函数是返回一个值的。否则就是映射了,那这些语言干嘛不再搞一个“映射”呢?这样我们可以通过一次调用获得许多值。
...全文
3601 83 打赏 收藏 转发到动态 举报
写回复
用AI写文章
83 条回复
切换为时间正序
请发表友善的回复…
发表回复
liyalei66 2012-02-15
  • 打赏
  • 举报
回复
我是那种看到内容不知所云的人
琴乐音 2008-03-25
  • 打赏
  • 举报
回复
fork()返回多个值
night_elf_1020 2008-03-24
  • 打赏
  • 举报
回复
有个对的到串口状态的函数GetCommState()是把设备的状态数据弄到一个包含很多数据的结构里DCB里!这样就可以得到很多数据!
l999358 2008-03-09
  • 打赏
  • 举报
回复
有很多数值要返回的时候就直接传地址好了,要不那运算速度啊 哎!
NoInfoNoFear 2008-01-22
  • 打赏
  • 举报
回复
其实这个问题可以这样提: 茴字为什么有四种写法?
cYBERyE 2008-01-22
  • 打赏
  • 举报
回复
介子纳须弥。。。一个返回值足已。。。
返回值可以是单值,也可以是集合嘛。
就这么简单朴素。
needallcodes 2008-01-20
  • 打赏
  • 举报
回复
返回是要有开销的, 这个开销当然是越小越好了

能解决问题的同时, 开销最小的方案最佳嘛
有指针,有结构, 多结果不算是问题
况且大部分时候, 程序中的表达式、逻辑控制、赋值等需要的是一个明确的值

为了控制多返回,肯定会增加附带的语言元素, 语言元素增加了,灵活性就会受到影响
我觉得C是效率至上的, 并且是语言元素最少,灵活性最高的语言,C在这方面不会舍近求远的

我的一点拙见...
1073X 2008-01-20
  • 打赏
  • 举报
回复
函数返回值在c中用寄存器EAX 表示,只有一个EAX寄存器,取得返回结果就是通过EAX得到。 通过其他方式是可以返回多个结果,但是这样性能方面就有有所降低了。C/C++很注重性能的。
------------------------------------------
是啦,多数C/C++的编译器都实现成用指定的寄存器做返回值,这样编译器更好实现,编译出来的目标码也显得更紧凑。在单返回值的语言里,用参数把结果带出来也可以实现多返回值的效果。
函数是特殊的映射,定义域中的成员必须在值域中找到唯一的对应,否则就不能称为函数。可能在计算机语言发展的早期,程序大多是用来完成数学运算的,所以就把这个函数的严格定义贯彻了下来。到了现在就可以看见很多的单返回值语言,可是实际上编程语言中的函数和数学中函数早就不能一概而论了。
liyuzhu_1984 2008-01-20
  • 打赏
  • 举报
回复
一个函数确实只能有一个返回值 但是你可以根据其他途径来得到更多的返回值
例如:1. 利用全局变量
2. 利用函数的形参(指针或者引用)
无论什么东西都有灵活性的
Mephisto_76 2008-01-20
  • 打赏
  • 举报
回复
同意卫亭的,有无必要而已。

简单就是美,通过最简单的理论,可以实现最复杂的构造。因为简单的东西能够被所有人理解,能够轻易的被扩展。但是对复杂的东西而言,这个往往就不成立。

人们可以轻松的把电压分为高电平和低电平。高者为1,低者为0。但是我相信人很难把电压分为十等分。这个就是为什么我们的电脑是基于二进制编码而不是基于十进制编码的原因。

python等语言通过tuple已经很完美地模拟了多值返回的效果,当然C++也可以做到用tuple模拟。C/C++、java和C#还可以通过定义结构/类来包装多值返回,虽然非常麻烦而且极不通用,但也是差强可用。
liqinghua1653 2008-01-16
  • 打赏
  • 举报
回复
函数返回值在c中用寄存器EAX 表示,只有一个EAX寄存器,取得返回结果就是通过EAX得到。 通过其他方式是可以返回多个结果,但是这样性能方面就有有所降低了。C/C++很注重性能的。
雪狼__ 2008-01-15
  • 打赏
  • 举报
回复
什么事情到最后都只有一个结果,不可能有两个结果吧?
zhangshunxing 2007-12-23
  • 打赏
  • 举报
回复
linux 下的fork()不就有两个返回值!
想了解更多的技术 请进纯c语言群:49465070

healer_kx 2007-12-03
  • 打赏
  • 举报
回复
看了大家的讨论,或许是我太喜欢返回多值的能力了。所以觉得一些人所以反对,处于的立场(原因)值得分析。
1. 认为函数就应该像是数学的函数那样,映射。
实际的数学和编程不能进行一一的对应的。而且多输入,单输出只是我们希望的理想情况。

2. 有的认为是无所谓,比如Java那样,用个Class做个Wrapper,或者是C#的our,ref参数等等。
这种无所谓是对于各位来说无所谓的,我给别人讲课的时候,讲C用指针,C++用引用来利用参数返回值的时候,他们是难以理解的。
而Java程序员又不喜欢这种方式,他们就觉得Wrapper天经地义。

上面这两种意见的本质是认为多返回值有没有,和好不好的问题。
但是我个人觉得这是一个方便不方便的问题。在实现上当然不是问题。

对于那些研究matlab的人,都是玩数学的,但是matlab一样是返回多值的,这对他们来说,是个贴心的设计。
mu_yang 2007-12-02
  • 打赏
  • 举报
回复
"一个就是多个,多个也是一个"
透彻!
wh_peng 2007-11-22
  • 打赏
  • 举报
回复
因为c又指针这个强大的东西,函数还要返回多个值干什么?不必要了,
Slin000 2007-10-31
  • 打赏
  • 举报
回复
// 我是学自动控制出身的。
// 我认为自然界中,当我们把某些东西看作是一个模块的时候。
// 它就是有若干个输入,若干个输出的子系统。
C的函数也是 有若干个输入,若干个输出的子系统, 如下:
void func( int in_a, int in_b, int & out_a, int & out_b);
这样的定义就是你要求的东东了.

返回值只是个返回值, 你学自动化的, 就别理它:)
tsst 2007-10-29
  • 打赏
  • 举报
回复
这应该是一个规则和习惯性的东西!就像是穿鞋,一只脚上只穿一只,当然你里面可以穿袜子!穿两只袜子可以说是保暖,而一只脚上穿两只鞋却只是为了好玩!
yanhailiangyhl 2007-10-09
  • 打赏
  • 举报
回复
返回值是为了方便使用的,如果不要返回值也完全可以,多一个输出参数就可以了。
有返回值为了方面的:
class A
{ B FunA();

};
class B
{
FunB();
}
我们可以这样使用:
A a; a.FunA().FunB;

一个函数有多个返回值的话,那么会乱的 如果 几个函数 可以返回多个类型的返回值,再语法上要表示出来是很比较伤脑筋的,还要考虑赋值,以及保持上面的这种特性也很困难的。即使设计出来这样的一套语法来,看起来也太复杂了。使用起来不好控制的。
zwvista 2007-09-27
  • 打赏
  • 举报
回复
其实函数仅返回一个值,其理由正如beepbug(放屁虫)所说
函数的原始设计是为了应用在表达式中。试问:如果返回值多于一个,怎么用于表达式中?

某些脚本语言(lua, python, ruby)看似能返回多值,实际上返回的不过是由多值组成的tuple(元组)而已,与C语言返回结构并无本质区别。
def max(a)
value = 0
index = 0
#compare code
value, index
end
#这里先装箱成tuple,然后再拆箱,分别赋值
max_value, index = max([1, 3, 4, 5, 2])

下面是C++的实现

#include <iostream>
#include <boost/tuple/tuple.hpp>
#include <boost/assign.hpp>
using namespace std;
using namespace boost;
using namespace assign;

tuple<int, int> f(const vector<int>& a)
{
int value, max_index;
//compare code
return make_tuple(value, max_index);
}

int _tmain(int argc, _TCHAR* argv[])
{
vector<int> v;
v += 1, 3, 4, 5, 2;
int value, max_index;
tie(value, max_index) = f(v);
cout << value << max_index << endl;
return 0;
}
加载更多回复(62)

3,881

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧