【问题标题】:Can a function return more than one value? [duplicate]一个函数可以返回多个值吗? [复制]
【发布时间】:2011-02-04 00:52:26
【问题描述】:

函数能否直接返回多个值(即,不返回通过引用获取的参数)?

【问题讨论】:

  • 如果您想要一个与语言无关的概述,这里有一个问题:stackoverflow.com/questions/1468375/…
  • 您可以作为数组返回,也可以将数组作为引用传递并将这些值存储到该数组中。

标签: c++ return-value


【解决方案1】:

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

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;
}

【讨论】:

  • 虽然从技术上讲这仍然是 C 中的一个值
  • 这是在回答“一个函数可以修改多个值吗?”这个问题。如果你想完整的话,它也可以修改全局变量。
  • 但是仍然只发送了一个值(它的地址),我们可以通过将整个对象复制到另一个对象中来访问它。我想知道我们是否可以同时分配两个值。
  • @ashish 不涉及地址。但要回答你的第二个问题,不,你不能。
【解决方案2】:

不,但您可以返回一个可以包含多个值的 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 所指出的,从技术上讲,这并不是返回多个变量,但它是一个很好的替代品。

【讨论】:

  • Nit pick:“另外,你可以像这样返回多个值:”应该是“另外,你可以像这样修改多个值:”。您还可以修改全局范围的变量。
【解决方案3】:

函数可以通过指定的方式返回值:

  • 通过任何类型的返回值
  • 通过指针
  • 通过参考
  • 通过设置全局变量(强烈不推荐)

如果您需要一个自包含的返回值,您通常会将所需的类型包装在一个结构中,并按值返回该结构的对象。如果您想避免保留本地副本,您可以传入要修改的参考参数。

【讨论】:

    【解决方案4】:

    boost::tuple 库中,a function called tie 简化了从返回的tuple 中获取信息的过程。如果您有一个函数返回两个doubles 中的tuple,并希望将它们加载到两个局部变量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,它不是某些standard library 的一部分吗?我正在使用命令g++ -std=c++11 swap.cpp -o main 在 ubuntu16.04 上运行我的程序。如果我不使用boost::tuple,我的程序运行良好!有什么建议我做错了吗?
    【解决方案5】:
    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的地址。所以它将存储在 main c cariable 中。我们可以通过指针检索这两个变量,

    【讨论】:

    • 导致未定义的行为。当aa 离开时,c1 的生命周期结束,所以c 指向一个死对象。访问它会导致未定义的行为。
    【解决方案6】:

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

    【讨论】:

      【解决方案7】:
      #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);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-07
        相关资源
        最近更新 更多