【问题标题】:Can a function return more than one value in C? [duplicate]一个函数可以在 C 中返回多个值吗? [复制]
【发布时间】:2014-12-06 05:16:33
【问题描述】:

我是 C 初学者。我听说 C 中的函数不能返回多个值,但在我的程序中不是这样;它返回多个值并且代码运行良好。请解释一下。

#include<stdio.h>
int main () {
    int a=10,b=9;
    return a,b;
}

【问题讨论】:

  • 你在另一边得到了什么?
  • 你检查过返回值吗?
  • 好的。展示您如何使用“返回”的两个值。
  • 阅读逗号运算符。 (该是公主新娘的名言了:“我不认为这意味着你认为它的意思。”)

标签: c


【解决方案1】:

回答这个问题:不是那样,不是。

  • 您可以返回一个指向包含多个值的 malloc 数组的指针。

  • 或者返回一个指向包含多个值的 malloc 结构的指针

  • 或者您可以将指向存储位置的指针作为参数的一部分传递给该函数,并在那里设置值。

  • 或者您可以将一些值放入该函数已经可以访问的现有数据结构(动态或静态)中。

  • 或者您可以将 int 或 long 划分为携带多个值的位域。

  • ...可能还有其他解决方案。

当然,要使其中任何一个起作用,调用者必须知道您正在使用什么方法并正确调用该函数。

但在 C 中,逗号不是返回多个值的解决方案。逗号运算符计算它的两个操作数,丢弃第一个的结果,并返回第二个。因此,您的样本只是查看a,将其丢弃,然后返回b。绝对不是你想的那样。

(我应该指出,C 使用逗号有几个不同的目的;例如,这里的逗号与数组初始值设定项中的逗号不同。)

不管怎样,我使用了一种允许用逗号分隔的多值表达式的语言:CLU,它是许多面向对象语言的祖先。在 CLU 中,您可以编写诸如 a,b=b,a 之类的语句来交换两个值,或者编写 `r,theta=cartesianToPolar(x,y)" 来进行坐标转换。这是一个不错的功能,并且易于实现在现代堆栈机器上。

CLU 有许多其他不错的功能,后来的语言没有采用;我一直想回去尝试找出原因。)

【讨论】:

    【解决方案2】:

    函数可以返回单个值。

     #include<stdio.h>
     int main () {
      int a=10,b=9;
      return a,b;
     }
    

    当你这样回来的时候。这里是逗号 (,)。运营商将工作。它将返回列表中的最后一个值。

    【讨论】:

      【解决方案3】:

      不,你不能从一个函数返回多个值,而是 您可以返回一个数组以返回相同数据类型的多个值 或者 您可以返回一个结构以返回不同数据类型的多个值

      【讨论】:

      • 您不能在 C 中返回数组,除非它们在结构中。
      • @PaulGriffiths 但可以返回指向该数组的指针,也许这就是他的意思。
      【解决方案4】:

      你问:

      一个函数能否在 C 中返回超过 1 个值

      如果您返回 struct 而不是来自 main,则可以这样做。 main 只能返回一个int

      typedef struct MyStruct {int a; int b;} MyStruct;
      
      MyStruct foo(int a, int b)
      {
          return MyStruct{a, b};  
      }
      
      int main ()
      {
         int a=10,b=9;
         MyStruct s = foo(a, b);
      }
      

      【讨论】:

        【解决方案5】:

        没有。 return 语句(第 6.8.6.4 节)只允许使用一个表达式,或者根本不允许。 表达式定义为:

        §6.5

        表达式是一系列运算符和操作数,用于指定 计算一个值,或指定一个对象或一个 功能,或产生副作用,或执行 的组合。一个操作数的值计算 运算符在计算结果的值之前排序 运营商。

        由于一个对象有一个“值”,你不能返回多个值。

        您遇到的称为comma operator(第 6.5.17 节),其中运算符的左操作数被评估为 void 表达式(基本上意味着它被丢弃)并产生右操作数。所以在你的情况下,a 被丢弃,b 被产生。

        【讨论】:

        • 你从哪里得到的段落?
        【解决方案6】:

        一个函数只能返回一个值。在您的代码中,它是这样工作的。

        int a=(1,10);
        

        现在您打印 a 的值,它将是 10。因此,像这样在给出逗号(,)作为回报时它可以工作。因此,如果您检查代码的返回值,它将是 9。

        【讨论】:

          【解决方案7】:

          不要只用编程的眼睛看。计算机编程中的函数这个词来自数学,我们可能都经历过数学中著名的函数 f(x,y..)= x(.)y..(无论是什么计算)。也就是说,任何复杂的计算最终都会产生一个显然是函数返回值的值。

          现在,如果您希望函数发送太多值,请将所有值作为单个值绑定到一个结构中,然后返回。

          【讨论】:

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