为什么某些流行语言中的函数只返回一种类型的结果?

Sag*_*rpe 6 memory syntax stack function stack-trace

为什么某些流行语言中的函数只返回一种类型的结果?

即我的意思是为什么编译器给下面的语法错误

public int int  returnTwoIntegers(){
.......
........
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*kos 22

函数只返回一个值,因为它是"他们"在汇编程序的旧时代发明它的方式.基本上发生的是该函数在堆栈上推送返回值.然后,调用者从堆栈中弹出值.如果函数返回多个值,调用者不会知道它有多少价值弹出,堆栈将是不平衡的(导致程序崩溃).

  • 但元组只有一个值(*包含*多个值). (7认同)
  • 这解释了汇编程序就是这样,但是有些语言具有多个返回值(元组)并支持直接装箱/拆箱 - 因此它们可以直接使用,就好像返回了多个元素一样... (2认同)
  • 请注意,在大多数常见的x86二进制调用约定中,返回值不在堆栈上,而是在EAX寄存器中. (2认同)

Gro*_*roo 18

函数(在您的标签中提到的语言)确实只有一个输出,但该输出不必是单个.您的输出可以很容易地成为一个封装您想要的任何数据量的类.

另请注意,您还可以通过引用函数传递多个输入参数,从而增加返回的输出数.

  • 请注意,函数式语言也有一个*输入*.卷曲或传递元组与返回元组或函数一样是人为的. (4认同)
  • -1这不是问题的答案,而是评论. (3认同)

pol*_*nts 10

简化问题.

您可以随时返回T[],Pair<L,R>,Set<E>这些语言等来模拟返回多个值.这样可以处理大多数多return值的情况.

为了获得这么少的收益,不值得改变语言的语义.

相关问题

  • @sushil:因为你所要求的东西相当于语法糖,虽然在仔细尝试使语言变甜的过程中没有任何内在错误,但也有一种简单,简单,实用的语言. (2认同)

And*_*anu 6

我最好的猜测是它从数学中延续下来.在那里你可以有一个具有多个参数的函数,并且值就是结果.

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认同)

小智 2

Daniel Weinreb——研究过 Lisp 方言(有多个返回值)和 Java(没有),解释了原因

当我们将多值返回功能添加到 Lisp 机器 Lisp 中(从此它进入 Common Lisp)时,我相信避免 consing 的愿望是重要的动机之一。那时,我们没有良好的 GC 技术,编写 Lisp 程序来小心地最小化 cons 是很常见的。

另一个原因是为了表达性:为了明确该函数实际上返回多个结果,而不是引入一个小列表“类型”(例如“文件句柄的两个列表和一个布尔值来说明是否.. .”)。

在 Java 中,我见过小类的定义,其唯一目的是作为返回多个值的方法。这种方法的优点是记录了返回值的类型和含义(至少如果您选择清晰的名称并添加注释的话!)。但在我看来,它相当冗长。

当我第一次回顾早期的 Java 规范时,我惊讶地发现没有办法返回多个值。我想游说添加这一点,所以我尝试提出一个既简单又非常引人注目的用例。我却无能为力!所以我没有尝试游说它。Java 的设计者显然试图避免大量花里胡哨的东西(以及语法糖),对此肯定有很多话要说。