Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C+;中只有一个返回值的原因是什么+;Java呢?_Java_C++ - Fatal编程技术网

在C+;中只有一个返回值的原因是什么+;Java呢?

在C+;中只有一个返回值的原因是什么+;Java呢?,java,c++,Java,C++,通常情况下,我会浏览一下这一事实,并将其视为“这就是轮子旋转的方式”,但今天我想知道这是从何而来:为什么函数只有一个返回(参考)值? 为什么不能,函数返回多个值是困难的还是不明智的?是因为对象吗?您应该如何期望数据包总是以对象引用的形式返回 如果将一个声明的函数视为一个契约,该契约规定了如何调用函数、函数应使用哪些参数以及函数的返回值类型,那么我看不到只有一个返回值背后的逻辑,因为可以反过来应用相同的逻辑(从而为多个返回值创建契约) 基于逻辑我能看到的唯一原因是,如果一个函数返回不止一件事,它也

通常情况下,我会浏览一下这一事实,并将其视为“这就是轮子旋转的方式”,但今天我想知道这是从何而来:为什么函数只有一个返回(参考)值?

为什么不能,函数返回多个值是困难的还是不明智的?是因为对象吗?您应该如何期望数据包总是以对象引用的形式返回

如果将一个声明的函数视为一个契约,该契约规定了如何调用函数、函数应使用哪些参数以及函数的返回值类型,那么我看不到只有一个返回值背后的逻辑,因为可以反过来应用相同的逻辑(从而为多个返回值创建契约)

基于逻辑我能看到的唯一原因是,如果一个函数返回不止一件事,它也应该为不止一个原因操作不止一件事,这与函数应该只做一件事的理念背道而驰。如果一件事是操纵一个对象并返回另一个对象,那么它是有意义的,您可以使用操纵的对象返回一个参考值


那么,为什么会存在这种限制呢

函数只是在堆栈中留下某些内容的子例程。如果堆栈中剩余的内容是不可预测的,那么现在必须有一些方法来预测堆栈中剩余的内容。这会产生开销。我们决定只指向一个东西,它可能是由许多东西组成的数据结构,也可能只是一个int


数学家会告诉你一个函数是关于将每个参数(输入值)与相应的输出值相关联,但对于计算机科学家来说,一个函数是关于堆栈返回时所处状态的契约。

这纯粹是历史。这就是数学函数通常的工作方式。此外,一些语言(实际上相当多)允许返回多个值——通常使用tuple对象

返回多个对象会很好的想法来得很晚。为什么选择通过对象而不是语言语法来完成?因为OO编程被广泛使用并被普遍接受

从语义上讲,两种方法都有相同的含义——“返回多个事物”。因此,添加这样的功能相当于支持具有相同含义的另一种语法。在编程中,有两种方法来做一件事是不受欢迎的。程序员想知道该选择哪种方法,有些人只知道一种方法,而编译器开发人员必须维护两种功能相同的机制。这是一个很好的理由。Okham的剃须刀是一种很受欢迎的工具。而且对象更有用

另一件事是,您的论点:“声明的函数作为契约,它声明如何调用函数,它应该使用哪些参数,以及它有哪些返回值类型,”,在粗体部分并不是很好


返回类型通常不被视为函数签名的一部分。不能有只在返回值上不同的重载。也就是说,编译器当然需要知道在函数完成后,它应该从堆栈中获取多少字节作为返回值。所以,这不是完全无关的,虽然通常语言不考虑这一点。

< P>当一个函数返回多个事物时,事物是相互关联的,至少是由单个函数返回的。仅考虑这一点就足以要求返回多个内容的函数的作者通过创建适当的数据结构将这些多个内容分组在一起,这在返回单个项目的函数中已经是可能的了

例如,在C++ >代码> STD::SET::INSERS/CODE >需要返回两个值——迭代器和<代码>布尔O/COD>以指示迭代器是否是一些旧元素或刚才插入的元素。解决方案是返回一个

std::pair

pair<iterator,bool> insert (const value_type& val);
当只有一个返回值时,简单直观。尝试返回多个值,如中所示

int x, y = f(w, z);
将变得很难解析,因为读者必须检查
f
的返回类型,并查看它是否返回一个
int
或两个
int
s


我甚至没有触及返回项目的数据类型不相同的情况!语法很快就会变成一场噩梦,而语言的表达能力却没有相应的提高。

每当你有多个值时
x1
xN
,您只需要一个元组
(x1,…,xN)
,它是一个单一(尽管是复合)值。如果您的语言中没有元组,可以随意使用任何聚合类型(
struct
class
、数组和其他集合)。因此,从这个角度来看,返回“多个”值和返回单个值是完全等效的

这只意味着你只需要一个,但为什么要忽略另一个呢

首先,您仍然需要聚合类型,因此可以选择是同时拥有这两种类型还是只拥有聚合类型。第二,如果一个函数可以返回“多个值”,那么您将面临一个语义难题:突然,一个表达式的计算结果不符合值(我们之前已经非常明确地定义了值),这是一个新的、不同的类别,称为“多个值”。现在这个结果的静态类型是什么?程序可以做什么,不能做什么?它在执行方面意味着什么


当然,您可以人为地回答这些问题,但任何明智的方法都只能是元组类型。忽略这一点会让你看不到一个非常有用的视角,拒绝让它们成为一级值可能比说“这些是元组类型,它们可以这样构造,也可以这样解构”要复杂得多
int x, y = f(w, z);
BigInteger[] divideAndRemainder(BigInteger divisor)
BigInteger q, BigInteger r divideAndRemainder(BigInteger divisor)
BigInteger q, BigInteger r = bigInt1.divideAndRemainder(bigInt2);
BigInteger[] arr = bigInt1.divideAndRemainder(bigInt2);
BigInteger q = arr[0];
BigInteger r = arr[1];
int foo(void)
{
    // no return statement; default register used
}