一个函数能返回多个值吗?

15

一个函数能够直接返回多个值吗?即,不通过使用 by-reference 参数返回多个值。


1
如果您想要一份与语言无关的概述,这里有一个问题:https://dev59.com/GHM_5IYBdhLWcg3wPAdF - P Shved
你可以返回一个数组,也可以将一个数组作为引用传递,并将这些值存储到该数组中。 - pocoa
7个回答

24
boost::tuple库中,有一种名为tie的函数,可以简化从返回的tuple中获取信息的过程。如果你有一个返回两个doubletuple的函数,并希望将它们加载到两个本地变量xy中,则可以将该函数的返回值分配给boost::tie(x, y)
例如:
#include <math.h>
#include <iostream>
#include <boost/tuple/tuple.hpp>

const double PI = 3.14159265;

boost::tuple<double, double> polar_to_rectangular(double radius, double angle)
{
    return boost::make_tuple(radius * cos(angle), radius * sin(angle));
}

int main()
{
    double x;
    double y;

    boost::tie(x, y) = polar_to_rectangular(4, (45 * PI) / 180);
    std::cout << "x == " << x << ", y == " << y << std::endl;

    return 0;
}

当我尝试使用boost::tuple时,它给了我一个错误fatal error: boost/tuple/tuple.hpp: No such file or directory,它不是一部分标准库吗?我正在ubuntu16.04上运行我的程序,命令为g++ -std=c++11 swap.cpp -o main。如果我不使用boost::tuple,我的程序可以正常运行!有什么建议我做错了吗? - Anu

15

可以 - 让你的函数返回一个结构体。或者通过引用参数返回值。

struct A {
   int x, y;
   A(int x, int y) : x(x), y(y) {}
};

A myfun() {
   return A(0, 42);    // return  two values
}

或者:

void myfun(int & a, int & b) {
   a = 0;
   b = 42;
}

4
虽然从技术上讲这仍然是C语言中的一个值。 - Nathan Fellman
这是否回答了问题:“一个函数能修改多个值吗?”如果你想完整的话,它也可以修改全局变量。 - Hogan
但是仍然只发送了一个值(它的地址),我们可以通过将其复制到另一个对象中来访问整个对象。 我想知道是否可以同时赋值两个值。 - Ashish Yadav
@ashish 没有涉及到地址问题。但是回答你的第二个问题,不行。 - anon

13
不行,但是你可以返回一个包含多个值的 pairboost::tuple。此外,你还可以使用引用来返回多个值,像这样:
void MyFunction(int a, int b, int& sum, int& difference);

您可以这样调用这个函数:

int result_sum;
int result_difference;
MyFunction(1, 2, result_sum, result_difference);

正如Hogan所指出的那样,从技术上讲,这并不是“返回”多个变量,但它是一个很好的替代品。


9
Nit pick应该改为“挑剔”,原文中的“In addition, you can return multiple values like this:”应该改为“In addition, you can modify multiple values like this:”。你也可以修改全局作用域变量。 - Hogan

1
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

typedef struct
{
    int a;
    int b;
}Mystruct;

Mystruct myfun(); 

int main()
{
    char name[30];
    Mystruct ms2;
    ms2 = myfun();
    printf("val1: %d   val2: %d",ms2.a,ms2.b);
    return 0;
}

Mystruct myfun()
{
    int a,b;
    Mystruct ms;

    a = 10;
    b = 20;
    ms.a=a;
    ms.b=b;

    return(ms);
}

1

函数可以通过以下方式返回值:

  • 通过任何类型的返回值
  • 通过指针
  • 通过引用
  • 通过设置全局变量(不建议使用)

如果您需要一个自包含的返回值,通常会将所需类型封装在结构体中,并通过值返回该结构体的对象。如果要避免保留本地副本,则应传递引用参数以进行修改。


0

使用结构体并返回不同数据类型的多个值。


-4
main()
{
  int a=10,b=20;
  int *c;
  c=aa(a,b);
  printf("%d %d",*c,*c+1);
}

void aa(int a,int b)
{
   int c1[2];
   c1[0]=b+a;
   c1[1]=a-b;
   return(c1);
}

这里将返回c1的地址,因此它将存储在主要的c变量中。我们可以通过指针检索两个变量。


2
导致未定义的行为。 当离开 aa 时,c1 的生命周期结束,因此 c 指向一个已死对象。 访问它会导致未定义的行为。 - GManNickG

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接