为什么方法不能返回多个值
Why methods can not return multiple values
只是想知道,在java、c、c++等语言中,方法有多个返回值是否有技术限制,或者限制只是由规范决定的?在汇编语言中,我理解被调用者可以弹出一个值来注册。
- 因为在C时代,只有一个寄存器用来保存返回值
- 因为如果您需要更多的值,您可以只返回一个
struct
、引用(在Java/C#中)或指针 - 因为您可以使用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::pair
、std::vector
、std::map
、std::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派生语言很可能会仔细考虑这样做。
- 从父类方法返回子类对象
- 获取从C++中同一类中的构造函数调用的方法返回的值
- 让bool方法返回其他整数
- 不能将方法返回的值用于另一个方法
- 如何实现 Front() 方法以返回模板化双向链表C++的第一个元素?
- 从私有成员变量的成员方法返回unique_ptr
- 我的模板类方法返回错误类型?
- std::find,返回所有找到的值的替代方法,而不仅仅是存在重复的向量的第一个值
- QtQuick - qml:28:错误:未知方法返回类型:自定义类型
- 方法错误"not all control paths return a value"和方法不返回值
- GRPC C++ TLS 客户端 grpc::SslCredentials() 方法不返回
- 我无法使用C++指针指向类方法返回的 std::vector
- 如何在工厂方法中返回指向基于基础操作系统的派生类的有效指针
- 将传入的网络"char*"数据转换为"uint8_t"并返回的安全方法是什么?
- C++方法是否可以根据传递给构造函数的参数具有不同的返回类型?
- EnQueue 方法在循环队列中未正确返回C++?
- 应用于const和非const对象的引用返回方法
- 在vc++ PPL中,如何创建一个同步返回的任务返回方法
- 为什么从浮点返回方法返回双精度不会在 c++ 中导致任何错误/警告
- 这个返回方法叫什么?