这是一段在C中完美执行的代码。
int a=3,b=4,x,y;
x=a+b;
y=a*b;
return(x,y);
此功能返回12.有人可以解释一下。
答案 0 :(得分:15)
这是因为您(无意中)使用comma operator,其值是包含的最后一个表达式的值。您可以列出任意数量的表达式,用逗号运算符分隔,结果始终是最后一个表达式的结果。这与return
无关;您的代码可以重写为
int tmp = (x, y); // x = 7, y = 12 -> tmp is assigned 12
return tmp;
[更新] 您通常不需要在列表周围使用括号,但是在这里,由于赋值运算符的优先级高于逗号,因此对@Draco的指责是值得的。
答案 1 :(得分:2)
编辑:这回答标题Q,即“可以返回多个值” 不完全是。你可以
答案 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);
}