具有多个值(变量)的return语句如何工作?

时间:2015-08-04 13:36:27

标签: c function

我试图了解如何通过价值和价值传递。返回发生在C函数中。我按照以下方式浏览了一段代码:

#include <stdio.h>

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

int main()
{
 int i=4, j=5, k, l;
 k = fun(i, j);
 l = fun(i, j);
 printf("%d %d\n", k, l);
 return 0;
}

显然,当我尝试通过fun()返回2个值时,我没有收到任何错误。

此外,fun()返回的值为ll,即20(= 4 * 5)而非kk。此外,如果我将return语句重写为:

return (ll,kk);

返回的值是kk的值。 9(= 4 + 5)。

查询:为什么会这样?

3 个答案:

答案 0 :(得分:2)

在您的代码中,在return声明中

 return (kk,ll);

您正在使用comma operator。通过逗号运算符的属性,您不会返回两个值,而只是返回逗号运算符的第二个操作数。

详细说明一下,让我们检查逗号运算符的属性,直接引用标准C11,章节§6.5.17,(强调我的

  

逗号运算符的左操作数被计算为void表达式;它的评估与右操作数之间存在一个序列点。然后评估右操作数; 结果有其类型和价值。

所以,基本上,像

这样的返回语句
 return (kk,ll);

相同
return ll;

希望你能弄清楚其他情况。

也就是说,main()的推荐签名是int main(int argc, char*argv[]),或者至少是int main(void)

答案 1 :(得分:1)

返回int时你有什么期望? C不支持元组。

您正在使用comma-operator(ll, kk)是一个单独的表达式,内部表达式(由,分隔 - 因此名称)从左到右进行评估。除了最右边(你可以有两个以上的子表达式)之外的所有结果都被丢弃,最右边的结果是整个表达式的结果。实际上,括号是不必要的,不会改变任何东西。

答案 2 :(得分:1)

您正在使用comma operator

  

逗号运算符(由标记,表示)是一个二元运算符,它计算第一个操作数并丢弃结果,然后计算第二个操作数并返回该值(和类型)。