我试图了解如何通过价值和价值传递。返回发生在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)。
查询:为什么会这样?
答案 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。
逗号运算符(由标记
,
表示)是一个二元运算符,它计算第一个操作数并丢弃结果,然后计算第二个操作数并返回该值(和类型)。