可以'返回'在C中返回多个值吗?

时间:2010-09-02 11:28:28

标签: c++ c

  

可能重复:
  C++ — return x,y; What is the point?

这是一段在C中完美执行的代码。

int a=3,b=4,x,y;
x=a+b;
y=a*b;
return(x,y);

此功能返回12.有人可以解释一下。

6 个答案:

答案 0 :(得分:15)

这是因为您(无意中)使用comma operator,其值是包含的最后一个表达式的值。您可以列出任意数量的表达式,用逗号运算符分隔,结果始终是最后一个表达式的结果。这与return无关;您的代码可以重写为

int tmp = (x, y); // x = 7, y = 12 -> tmp is assigned 12
return tmp;

[更新] 您通常不需要在列表周围使用括号,但是在这里,由于赋值运算符的优先级高于逗号,因此对@Draco的指责是值得的。

答案 1 :(得分:2)

编辑:这回答标题Q,即“可以返回多个值” 不完全是。你可以

  1. 使用引用(或指针)参数
  2. 返回第二个变量
  3. 否则,创建一个包含x和y的新类或结构,并返回此新类的实例

答案 2 :(得分:2)

不,您不能简单地使用(x, y)返回多个值 - 这不是一个元组,正如您可能对其他语言所期望的那样,而是括号内使用comma operator,它只会评估为y(反过来,由return返回。)

如果要返回多个值,则应create a struct,如下所示:

#include <stdio.h>

struct coordinate
{
    int x;
    int y;
};

struct coordinate myfunc(int a, int b)
{
    struct coordinate retval = { a + b , a * b };
    return retval;
}

int main(void)
{
    struct coordinate coord = myfunc(3, 4);
    printf("X: %d\n", coord.x);
    printf("Y: %d\n", coord.y);
}

这显示了使用结构的完整语法,但如果您喜欢以下内容,则可以use typedef

typedef struct
{
    int x;
    int y;
} coordinate;

coordinate myfunc(int a, int b)
{
    coordinate retval = { a + b , a * b };
    return retval;
}

// ...etc...

答案 3 :(得分:1)

你的问题的答案是“不,返回不能返回多个值”。在这里,您可以看到法律用语x,y的评估结果,即y,即3 * 4 = 12。

答案 4 :(得分:1)

comma operator只是一个二元运算符。返回最右边的值。

答案 5 :(得分:0)

这是逗号运算符。它评估它的左侧,然后评估它的右侧,其结果值是右侧。

因此,return(x,y)return y相同,因为评估x没有副作用。

在C中“返回多个值”的唯一方法是按值返回结构:

#include <stdio.h>

typedef struct {
    int sum;
    int product;
} sumprod;

sumprod get_sum_and_product(int x, int y) {
    sumprod ret = {x + y, x * y};
    return ret;
}

int main() {
    sumprod values = get_sum_and_product(3,4);
    printf("sum is %d, product is %d\n", values.sum, values.product);
}