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

Why methods can not return multiple values

本文关键字:返回 方法 不能 为什么      更新时间:2023-10-16

只是想知道,在java、c、c++等语言中,方法有多个返回值是否有技术限制,或者限制只是由规范决定的?在汇编语言中,我理解被调用者可以弹出一个值来注册。

  1. 因为在C时代,只有一个寄存器用来保存返回值
  2. 因为如果您需要更多的值,您可以只返回一个struct、引用(在Java/C#中)或指针
  3. 因为您可以使用out参数

允许多个返回值会增加复杂性,这只是简单的解决方法。它没有理由在那里。(事实上,在C++中,您可以返回一个tuple(来自TR1、C++11或boost),它实际上是多个返回值)

它是设计的,因为在返回语句中不需要允许多个值。您总是可以定义一个具有所有所需成员的结构,并创建该结构的实例并返回它。简单!

示例,

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

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

有趣的编码和许多令人愉快的回报:-)

这只是一个决定,因为人们已经习惯了它。原则上,不会有任何事情阻止语言设计师实现这样的语法:

(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(...)

其中函数可以返回详细的错误代码或有效的文件句柄。尽管现在这里也有例外。但从某种意义上说,异常是返回至少两个交替值的一种方式,即请求的函数返回值或引发的异常。

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

只有我的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-cell、array)和多个值之间存在特殊的语法区别。

这只是由语言和/或ABI设计者做出的决定。不多不少。不过,在汇编语言中,你可以自己做出这些决定——我不确定你最后的评论是什么意思。

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

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

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

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

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

第二种方法是通过引用(nonconst)传递参数,并将值放入其中。

支持这一点很有用,而且考虑到人们在其他语言中觉得它很方便,C和Java也可能会这样做。

C++已经在为函数调用方 对Ruby和python中熟悉的返回值进行方便、直观的处理,这比return本身更重要,因为单个函数可能会从许多调用站点调用。

具体来说,这里的C++17论文(另请参阅这里的措辞)记录了一个符号。。。

auto [x,y,z] = expression;

其中,表达式可以是返回数组、tuple或具有所有public成员的struct的函数,也可以是对其求值的任何其他表达式。在上面的前面可以加上const,以使局部变量const

该功能还记录了这一点。。。

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

这避免了重复使用表达较少的CCD_ 15和CCD_。

随着C++朝着这个方向发展,C和其他C派生语言很可能会仔细考虑这样做。