为什么方法不能返回多个值

时间:2011-06-23 18:22:39

标签: java c++ c programming-languages

很奇怪在java,c,c ++等语言中为方法设置多个返回值有什么技术限制吗?在汇编语言中我理解callee可以弹出一个值来注册。

10 个答案:

答案 0 :(得分:19)

  1. 因为在C的日子里,有一个用于保存返回值的寄存器。
  2. 因为如果您需要更多值,您只需返回struct,引用(在Java / C#中)或指针。
  3. 因为您可以使用out参数。
  4. 允许多个返回值会增加复杂性,而且它只是解决了问题。它没有理由在那里。 (实际上,在C ++中,你可以返回一个tuple(来自TR1,C ++ 11或boost),这实际上是多个返回值)

答案 1 :(得分:9)

它的设计,因为不需要在return语句中允许多个值。您始终可以使用所有需要的成员定义结构,并创建结构的实例并将其返回。简单!

实施例,

struct Person
{
   std::string Name;
   int Age;
   std::string Qualification;
   //...
};

Person GetInfo()
{
    Person person;
    //fill person's members ...
    return person;
}

您可以使用std::pairstd::vectorstd::mapstd::list等。在C ++ 0x中,您也可以使用std::tuple

答案 2 :(得分:6)

如果精灵只给你一个愿望,你可以希望有任意数量的愿望。它只与方法中的一个返回值相同。您可以使用返回值作为指向充满属性的对象所在的地址的指针,然后查询这些属性(属性)......这种方式确实没有限制。 : - )

有趣的编码和许多快乐的回报: - )

答案 3 :(得分:3)

这只是一个决定,因为人们已经习惯了。原则上,没有任何东西阻止语言设计者实现这样的语法:

(int, int, int) call(int x, int y, int z);

并且函数调用可能如下所示:

(a, b, c) = call(1, 2, 3);

或他们为此任务选择的任何语法。虽然可以讨论是否会增加可读性。正如其他人所指出的那样,有些语言是通过元组或类似的结构来实现的。

当然,退货声明:

(int, int, int) call(int x, int y, int z);
{
  return x+1, y+1, z+1
}

你甚至可以想到有用的应用程序,如:

(err, filehandle) = OpenFileDialog(...)

其中函数可以返回详细的错误代码或有效的文件句柄。虽然例外现在占据了这个地方。但在某种意义上,异常是一种返回至少两个交替值的方法,可以是请求的函数返回值,也可以是引发的异常。

答案 4 :(得分:2)

因为优秀的编程语言鼓励程序员做正确的事情。如果一个方法需要返回多个值,那么这些值可能是相关的,因此应该像结构一样组合在一起。

只需2美分。

答案 5 :(得分:2)

这主要是由于历史原因与机器调用约定有关。另外因为C在被叫方端没有模式匹配语法来检索结果。请注意,ML或Haskell等语言具有语法轻量级元组类型,可完全用于返回多个值。

编辑:

实际上考虑一下,我想如果你想分裂头发,ML和Haskell仍然有一个“单一”的返回值。只是元组在语法上是如此轻量级,以至于考虑函数返回多个值而不是单个元组是很方便的。

要完全严谨,我可以想到有两种语言具有“正确的”多值返回,而不仅仅是某种形状的元组。一个是Scheme,(c.f call-with-values),另一个是MATLAB:

function [x,y] = myFunc(a, b)
   ...
end

[p, q] = myFunc(3,4)

在这两种语言中,单个值恰好是聚合(cons单元格,数组)和多个值之间存在特殊的语法区别。

答案 6 :(得分:1)

这只是语言和/或ABI设计师做出的决定。不多也不少。在汇编语言中,您可以自己做出这些决定 - 我不确定您最后的评论意味着什么。

答案 7 :(得分:0)

我们不需要能够返回C ++语言中内置的多个值,因为库工作得很好:

std::tuple<int,float> func()
{
    return std::make_tuple(1, 2.f);
}

int i;
float f;

std::tie(i, f) = func();

大多数其他语言在其标准库中具有类似的功能。

答案 8 :(得分:0)

实际上,至少有两种方法可以返回多个值。

首先是返回创建一个结构或类,放入所有返回数据,然后返回它。

第二个是通过引用传递参数(非常量)并将值放在那里。

答案 9 :(得分:0)

支持这一点很有用,考虑到人们在其他语言中如何方便,C和Java也可能会这样移动。

C ++已经标准化了对例如熟悉的返回值的方便,直观的处理方式。函数调用者方面的Ruby和python ,这比return本身更重要,因为很多调用站点可能会调用单个函数。

具体来说,C ++ 17论文here(另见措辞here)记录了一个符号......

auto [x,y,z] = expression;

...其中expression可以是一个函数返回 - 或任何其他表达式求值 - 一个数组,tuplestruct所有public成员。上面可以在const之前创建局部变量const

该功能还记录了这个......

for (const auto& [key,value] : mymap)
    ...

...避免重复使用表现力较低的->first->second

随着C ++向这个方向发展,C和其他C语言很可能也会仔细研究。