Sag*_*rpe 6 memory syntax stack function stack-trace
为什么某些流行语言中的函数只返回一种类型的结果?
即我的意思是为什么编译器给下面的语法错误
public int int returnTwoIntegers(){
.......
........
}
Run Code Online (Sandbox Code Playgroud)
Mar*_*kos 22
函数只返回一个值,因为它是"他们"在汇编程序的旧时代发明它的方式.基本上发生的是该函数在堆栈上推送返回值.然后,调用者从堆栈中弹出值.如果函数返回多个值,调用者不会知道它有多少价值弹出,堆栈将是不平衡的(导致程序崩溃).
Gro*_*roo 18
函数(在您的标签中提到的语言)确实只有一个输出,但该输出不必是单个值.您的输出可以很容易地成为一个封装您想要的任何数据量的类.
另请注意,您还可以通过引用函数传递多个输入参数,从而增加返回的输出数.
pol*_*nts 10
简化问题.
您可以随时返回T[],Pair<L,R>,Set<E>这些语言等来模拟返回多个值.这样可以处理大多数多return值的情况.
为了获得这么少的收益,不值得改变语言的语义.
我最好的猜测是它从数学中延续下来.在那里你可以有一个具有多个参数的函数,并且值就是结果.
f(x1, x2, ...) = y (the formula might be something like x1 + x2^2 + x3^3 + ...)
Run Code Online (Sandbox Code Playgroud)
即使您想将多维域映射到多维范围,通常也会写为:
f1(x1, x2, ...) = y1 (perhaps y1 = x1 + x2^1 + ... like above)
f2(x1, x2, ...) = y2 (and y2 = x1 - x2^2 + x3^3 - x4^4 +...)
...
Run Code Online (Sandbox Code Playgroud)
因为每个y都根据输入得到它自己的数学公式,在编程中它只会转换成多个函数,所以将它分开是有意义的.
问题是有时y1和y2的公式可能非常相似,或者依赖于迭代相同的东西或其他东西,将它们组合在一起可能更有意义.在python中你可以做到
返回a1,a2;
然后把它称为
x,y = f();
但在大多数语言中,您只能返回一个变量.这并不能阻止你将它变成一个包含多个值的复杂对象.
小智 2
Daniel Weinreb——研究过 Lisp 方言(有多个返回值)和 Java(没有),解释了原因:
当我们将多值返回功能添加到 Lisp 机器 Lisp 中(从此它进入 Common Lisp)时,我相信避免 consing 的愿望是重要的动机之一。那时,我们没有良好的 GC 技术,编写 Lisp 程序来小心地最小化 cons 是很常见的。
另一个原因是为了表达性:为了明确该函数实际上返回多个结果,而不是引入一个小列表“类型”(例如“文件句柄的两个列表和一个布尔值来说明是否.. .”)。
在 Java 中,我见过小类的定义,其唯一目的是作为返回多个值的方法。这种方法的优点是记录了返回值的类型和含义(至少如果您选择清晰的名称并添加注释的话!)。但在我看来,它相当冗长。
当我第一次回顾早期的 Java 规范时,我惊讶地发现没有办法返回多个值。我想游说添加这一点,所以我尝试提出一个既简单又非常引人注目的用例。我却无能为力!所以我没有尝试游说它。Java 的设计者显然试图避免大量花里胡哨的东西(以及语法糖),对此肯定有很多话要说。