为什么说函数只能返回一个值,返回一个数组或指针依次赋值给变量不可以吗?
菜鸟求指点
可以啊!更好的做法是结构体,可以返回多个不同类型的值
返回一个C数组是不行的。但你可以返回C++的array、tuple和pair。这些都要求长度是编译期可以确定的。不能确定就要其他方法了。
返回指针有生存期管理的问题。你不能定义一个本地变量数组,然后返回指针,这样的代码有未定义行为。你可以自己new一块内存来返回,然后调用者必须负责delete——忘了就是内存泄漏。所以更常见的是返回一个智能指针。另外一种做法是调用者分配内存,把指针和长度作为参数传给函数。这也是一种常规做法。
C : 确实只能返回一个值,想要“返回多个值”用结构体,或者采用全局变量传递信息,或者指针传参(见下一条);
C++:可以像 C 用结构体,或者很多 C/C++ 第三方库采用的是这种方法:传入一个指针/引用参数存放返回结果;比如 OpenCV 里用来相机标定的函数 calibrateCamera,里面传入的参数里有四个是用来存放返回结果的:
当然了,也可以用 解决:
事实上很多语言都可以用元组搞定这个问题,比如
Rust:
Haskell:
Swift:Swift 函数 | Swift 编程语言中文教程
F#:Tuples – F# | Microsoft Learn
C# :
除了像 C / C++ 的方法返回结构体或者 ,C# 也可以用 out 参数,
C#7.0 后可以用内联变量声明简化上面这个写法:
Solidity:
有很多语言是天然支持返回多个值的(本质上还是元组),比如
Python:
Go:
反而像 Java 这种 语言就只能返回一个封装类了( ):-)
补充一下为什么
早期编程语言设计上并不认为必须有返回值。很多语言有过程的概念,它与函数有不少区别,其中之一就是过程不返回值。
而函数之所以有返回值,是模拟数学上函数的概念,把自变量计算成应变量,而常见的数学函数都只有一个应变量。
以C语言为例,早期可以不写返回类型,是否返回值,全看有没有return语句。void这个关键字是比较晚才加入C语言中。
在结构化编程盛行时,甚至要求只有一个出口,即一个函数中只能有一个return语句。当时不支持多返回值也不难理解。
当年有一个小技巧可以让C语言在x86体系下,返回多个值,不知道还有没有人知道?
问题问得不清不楚——“返回一个指针”不也是“返回一个值”吗?那么什么又叫“依次赋值给变量”?又是赋值哪个变量?是指把调用函数后的返回值赋值给某个变量吗?
看不懂,答不了。这不是编程水平菜,是语文水平菜。
2024最新激活全家桶教程,稳定运行到2099年,请移步至置顶文章:https://sigusoft.com/99576.html
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。 文章由激活谷谷主-小谷整理,转载请注明出处:https://sigusoft.com/96655.html