C 这个包含多个值(变量)的返回语句是如何工作的?

C 这个包含多个值(变量)的返回语句是如何工作的?,c,function,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); retu

我试图了解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;
}
返回的值是
kk
的值,即9(=4+5)


查询:为什么会这样

在代码中,在
return
语句中

 return (kk,ll);
你在用这个。根据逗号运算符的属性,您不会返回两个值,而是只返回逗号运算符的第二个操作数

为了详细说明,让我们检查逗号运算符的属性,直接引用标准,
C11
,第§6.5.17章,(重点)

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

因此,本质上,返回语句

 return (kk,ll);

return ll;
希望你能想出另一个例子



也就是说,
main()
的建议签名是
intmain(intargc,char*argv[])
或者至少是
intmain(void)
在您的代码中,在
return
语句中

 return (kk,ll);
你在用这个。根据逗号运算符的属性,您不会返回两个值,而是只返回逗号运算符的第二个操作数

为了详细说明,让我们检查逗号运算符的属性,直接引用标准,
C11
,第§6.5.17章,(重点)

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

因此,本质上,返回语句

 return (kk,ll);

return ll;
希望你能想出另一个例子



这就是说,
main()
的建议签名是
intmain(intargc,char*argv[])
或者至少是
intmain(void)

返回int时您希望得到什么?C不支持元组


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

返回int时,您希望得到什么?C不支持元组

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

您正在使用

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

您正在使用

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


出于兴趣,你以为会发生什么?@没用,可能是编译器错误。引用OP“现在看来我没有收到任何错误”:-)事实上是的。各种各样的错误消息。例如,出于兴趣,尝试传递并返回多个值等,您希望发生什么情况?@可能是无用的,编译器错误。引用OP“现在看来我没有收到任何错误”:-)事实上是的。各种各样的错误消息。例如,尝试传递并返回多个值等。