具有多个值(变量)的返回语句如何工作?
我试图了解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)
是一个单独的表达式,内部表达式(由 – ,因此名称分隔)从左到右进行评估。 除最右边(可以有两个以上的子表达式)之外的所有结果都被丢弃,最右边的结果是整个表达式的结果。 实际上括号是不必要的,不会改变任何东西。
您正在使用逗号运算符 。
逗号运算符(由标记表示)是一个二元运算符,它计算其第一个操作数并丢弃结果,然后计算第二个操作数并返回该值(和类型)。