很奇怪在java,c,c ++等语言中为方法设置多个返回值有什么技术限制吗?在汇编语言中我理解callee可以弹出一个值来注册。
答案 0 :(得分:19)
struct
,引用(在Java / C#中)或指针。允许多个返回值会增加复杂性,而且它只是解决了问题。它没有理由在那里。 (实际上,在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::pair
,std::vector
,std::map
,std::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可以是一个函数返回 - 或任何其他表达式求值 - 一个数组,tuple
或struct
所有public
成员。上面可以在const
之前创建局部变量const
。
该功能还记录了这个......
for (const auto& [key,value] : mymap)
...
...避免重复使用表现力较低的->first
和->second
。
随着C ++向这个方向发展,C和其他C语言很可能也会仔细研究。