【发布时间】:2011-04-07 07:11:53
【问题描述】:
这是一段在 C 中完美执行的代码。
int a=3,b=4,x,y;
x=a+b;
y=a*b;
return(x,y);
这个函数返回12。谁能解释一下。
【问题讨论】:
-
你似乎在这里问了两个不同的问题。
这是一段在 C 中完美执行的代码。
int a=3,b=4,x,y;
x=a+b;
y=a*b;
return(x,y);
这个函数返回12。谁能解释一下。
【问题讨论】:
这是因为您(不经意间)使用了comma operator,其值是包含的最后一个表达式的值。您可以列出任意数量的表达式,用逗号分隔,结果始终是最后一个表达式的结果。这与return 无关;您的代码可以像这样重写
int tmp = (x, y); // x = 7, y = 12 -> tmp is assigned 12
return tmp;
[更新] 您通常不需要将括号括在列表中,但在这里您需要,因为赋值运算符具有比逗号更高的优先级 - 感谢 @Draco 指出它。
【讨论】:
您的问题的答案是“不,return 不能返回多个值”。在这里,您可以看到对合法表达式 x,y 的求值结果,即 y,即 3*4 = 12。
【讨论】:
编辑:这回答了标题 Q,即“可以返回返回多个值” 不完全是。你可以
【讨论】:
这是逗号运算符。它先计算其左侧,然后计算其右侧,其结果值为右侧。
所以,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);
}
【讨论】:
comma operator 只是一个二元运算符。返回最右边的值。
【讨论】:
不,您不能简单地通过使用 (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...
【讨论】: