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

我试图了解C函数中的值和返回值是如何传递的。 我按照以下方式浏览了一段代码:

#include  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)。

查询 :为什么会这样?

在您的代码中,在return语句中

  return (kk,ll); 

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

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

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

所以,基本上,像一个返回声明

  return (kk,ll); 

和…一样

 return ll; 

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


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

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

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

您正在使用逗号运算符 。

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