【问题标题】:Can a function return two values? [duplicate]函数可以返回两个值吗? [复制]
【发布时间】:2011-02-28 07:02:02
【问题描述】:

可能重复:
returning multiple values from a function

我有一个必须返回两个值的函数

                    return(&ptr->keys[pos].value)
                    return Duplicate;

这里 &ptr->keys[pos].value 将给出地址,Duplicate 是一个设置为 2 的枚举值...如何将这两个值返回给另一个函数 insert_front,它是一个链表 this &ptr->keys [pos].value 用作链表的首地址。 我应该写的调用函数的原型应该是什么?

【问题讨论】:

  • 彼得·明切夫的回答是正确的。你的只会返回第一条语句;遇到“return”时,会在该点退出函数。

标签: c


【解决方案1】:

您不能返回两个值。但是,您可以返回单个值,即包含两个值的结构体。

【讨论】:

    【解决方案2】:

    一个函数只能返回一件事。要么创建一个包含所有要返回的内容的结构,要么通过引用传递一些函数参数。

    【讨论】:

      【解决方案3】:

      罗伯特的代码是正确的。但是,您 /can/ 也可以使用没有 malloc 的结构,如下所示:

      struct retstruct {
          int a;
          int b;
      };
      struct retstruct myfunc(void) {
          struct retstruct r;
          r.a = 1;
          r.b = 2;
          return r;
      }
      
      int main()
      {
          struct retstruct r;
          r = myfunc();
          printf("a=%d  b=%d\n", r.a, r.b);
      }
      

      这通常被避免,因为传递这样的结构通常会更昂贵(性能方面),但如果您只需要这样的几个值,就足够了。

      【讨论】:

        【解决方案4】:

        要返回两个值,您必须定义某种结构来保存这两个值,并返回该结构的一个实例。或者,您可以将一个或两个地址传递给函数,并让它在那里写入值。

        【讨论】:

          【解决方案5】:

          不,你不能在一个函数中有两个返回,第一个返回将退出你需要创建一个对象的函数。注意:我很久没有用C写代码了,所以这里的语法可能是关闭的。

          public class link{
            private int& ptr;
            private int Duplicate;
          
            public constructor link() {}
          
            public setPtr(int& ptr) {
               this->&ptr = ptr;
            }
          
            //set duplicate function
          
            //get ptr function
          
            //get duplicate function
          
          }
          

          并在创建链接对象之前发布的 sn-p 函数中设置所需的值,然后返回(链接对象);

          【讨论】:

          • 上面的typedef答案绝对是更好的解决方案。
          • “我好久没用 C 写代码了”...以至于忘记了 C 不是对象,没有 class 关键字 :)
          【解决方案6】:

          在 C/C++ 中,函数不能返回两个值。然而,大多数情况下,这个限制实际上是有意义的:在任何复杂的函数中,你想要更新一些数据(一堆变量、一个数组等),并返回函数的状态,即它是成功还是不是。因此,一个好的做法是返回函数的状态,并使用引用(在 C++ 中)或指针(在 C 中)来修改您的参数,就像在 C 中的这个示例中一样:

          int swap(int* a, int* b)
          {
             int tmp = *a;
             *a = *b;
             *b = tmp;
             return 0;
          }
          

          当然,这个功能太简单了(有点),但你明白了:P

          然后,如果您真的希望您的函数返回 2 个值,那么您可以使用其他回答者提出的所有技巧。

          【讨论】:

            【解决方案7】:

            像这样:

            typedef ret {
                int val1;
                int *val2;
            } ret_t ;
            
            // make sure to remember to free the struct when you're done with it
            ret_t *myFunc( void ) {
                ret_t *r = malloc( sizeof(ret_t) );
                r->val1 = 1;
                r->val2 = &r.val1;
            
                return r;
            }
            
            // You can also return a copy of the struct on the stack
            ret_t myFunc( void ) {
                ret_t r;
                r.val1 = 1;
                r.val2 = &r.val1;
            
                return r;
            }
            

            【讨论】:

            • 你为什么使用malloc?使用堆栈返回 2 个整数更快,并且您不需要释放返回的值。可以避免更多错误:r 必须是指针...
            • 我的两个返回值不同,一个返回一个int,另一个返回一个地址...如果它必须保存地址,应该是我的结构成员数据类型。
            • @knivil:我展示了返回多个值的一般解决方案,这是一个结构。在这种情况下,在堆栈上返回 2 个 int 可能会更快,但如果他必须返回 20 个 int 怎么办?
            • @asir:所以只需将结构中的第二个值设为指针类型。请参阅我的编辑。您也可以直接返回结构的副本。
            猜你喜欢
            • 1970-01-01
            • 2011-02-04
            • 2011-01-20
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-04-16
            • 1970-01-01
            相关资源
            最近更新 更多