【问题标题】:Function returning two things seperated by a comma in C [duplicate]在C中返回用逗号分隔的两件事的函数[重复]
【发布时间】:2014-09-02 23:21:56
【问题描述】:

好的,下面是代码。

#include <stdio.h>
int addmult (int,int);
int main (void)
{
    int i=3,j=4,k,l;
    k = addmult(i,j);
    l = addmult(i,j);
    printf("%d %d\n",k,l);
    return 0;
}

int addmult ( int ii, int jj )
{
    int kk,ll;
    kk = ii + jj;
    ll = ii*jj;
    return(kk,ll);
}

一个函数如何在 C 中同时返回两个东西?

编辑:此代码运行良好。我想知道,它为什么有效?

【问题讨论】:

  • 改为返回结构或数组(动态分配)。
  • 它不是返回两件事,它只是返回一件事:ll
  • 你需要了解逗号运算符
  • 但是为什么它会这样工作呢?函数如何一次返回两个值?
  • 它没有返回多个值。请注意 return 语句中的逗号 (',') 运算符,该运算符从左到右计算并返回最右边的表达式作为结果。因此 12 被退回。

标签: c


【解决方案1】:

你问的是哪一行

return(kk,ll);

您是否或如何从一个函数返回多个值?

回答第一个,这段代码在功能上等价于:

int ret = (kk,ll);
return ret;

这可能会使它更清楚一点。这是逗号运算符的一个实例,其计算结果是其第二个操作数,因此代码实际上在功能上也等同于:

return ll;

永远不会使用 kk 值。

要解决您问题的第二种可能解释:使用结构,例如:

struct product_and_sum
{
  int product;
  int sum;
};

更改函数以返回 struct product_and_sum 并返回适当初始化的结构值。

【讨论】:

  • 我知道了。 :) 我还有一个疑问。如果一个函数返回一个值,那么它返回时是否需要收集它的值?
  • @user3797829 不,对于您不通过printf 函数收集返回值的示例,这是可选的! ...另外了解ret = (kk,ll);ret = kk, ll; 之间的区别
  • 好吧,如果你能在这里简要介绍一下,有什么区别?而且,对于用户定义的函数来说,不收集值也足够了,对吧?
  • @user3797829:没有必要,例如你有像foo();这样的指令。但是,如果您想明确地说结果被丢弃,那么您可以提供 void cast,例如(void) foo();。它对编译器没有任何影响,仅适用于splintIIRC等一些静态分析工具。
  • @user3797829:很多很多函数都返回值。例如,sprintf 返回“写入输出字符串的字符数”。问题是:您将使用返回值做什么?对于sprintf,可以使用返回值,也可以忽略。不使用sqrt 的返回值会很奇怪。
猜你喜欢
  • 2015-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-27
  • 2012-08-07
  • 2015-10-06
  • 2018-05-12
相关资源
最近更新 更多