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

2022-09-01 08:11:08

通常,我瞥了一眼这个事实,只是接受它作为“这就是轮子的旋转方式”,但今天我想知道这来自哪里:为什么一个函数只有一个返回(参考)值?

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

如果你看到一个声明的函数是一个合约,它说明了如何调用一个函数,它应该采用哪些参数,以及它具有哪种返回值类型,那么我看不到只有一个返回值背后的逻辑,因为你可以反过来应用相同的逻辑(从而为多个返回值创建一个合约)。

我能看到的基于逻辑的唯一原因是,如果一个函数返回超过1个事物,它也应该出于超过1个原因操纵1个以上的东西,这与函数应该只做一件事的哲学背道而驰。如果一件事是操纵一个对象并返回另一个对象,那么这将是有意义的,你可以返回一个参考值与操纵的对象。

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


答案 1

每当你有多个值时......,你就会平凡地拥有元组,它是一个单一的(尽管是复合的)值。如果您的语言中没有元组,请随意使用任何聚合类型(、、数组、其他集合)。因此,从这个角度来看,返回“多个”值和返回单个值是完全等效的。x1xN(x1, ..., xN)structclass

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

首先,您仍然需要聚合类型,因此可以选择同时拥有两者或仅具有聚合类型。其次,如果一个函数可以返回“多个值”,你就会面临一个语义难题:突然之间,一个表达式的计算结果不是值(我们之前已经非常具体地定义了),这是一个新的,不同的类别,称为“多个值”。那么这个结果的静态类型是什么?该程序可以做什么,不能用它做什么?这在实施方面意味着什么?

你当然可以人为地回答这些问题,但任何明智的方法都只相当于元组类型。忽略这一点会让你对一个非常有用的观点视而不见,拒绝使它们成为一等值可能比说“这些是元组类型,它们可以像这样构造并像这样解构”复杂。


答案 2

当一个函数返回多个事物时,这些事物是相互关联的,至少是由单个函数返回的。仅此一点就足以要求返回多个事物的函数的作者通过创建适当的数据结构将这些多个事物组合在一起,这对于返回单个项的函数已经是可能的。

例如,在C++需要返回两个值 - 一个迭代器,以及一个指示迭代器是某个旧元素还是我们刚刚插入的元素。解决方案是返回 :std::set::insertboolstd::pair

pair<iterator,bool> insert (const value_type& val);

第二个考虑因素是纯粹实际的:在这样的表达式中处理多个返回值

int x = f(y);

当只有一个返回值时,它简单直观。尝试返回多个值,如

int x, y = f(w, z);

将变得难以解析,因为读取器必须检查返回类型,看看它是否返回一个或两个s。fintint

我甚至没有触及返回项的数据类型不相同的情况!语法很快就会成为一场噩梦,语言的表现力没有可比的提升。


推荐