【问题标题】:How does this return statement with multiple values (variables) works? [duplicate]这个具有多个值(变量)的返回语句是如何工作的? [复制]
【发布时间】:2015-08-04 13:36:26
【问题描述】:

我试图了解 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)。

查询:为什么会这样?

【问题讨论】:

  • 出于兴趣,您预计会发生什么?
  • @Useless 也许是编译器错误。引用 OP “现在显然我没有收到任何错误”:-)
  • 其实是的。各种错误消息。就像试图通过返回超过 1 个值等。

标签: c function


【解决方案1】:

在您的代码中,在 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)

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      您正在使用comma operator

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

      【讨论】:

        猜你喜欢
        • 2014-01-30
        • 2012-07-12
        • 1970-01-01
        • 2023-04-02
        • 2021-04-28
        • 1970-01-01
        • 1970-01-01
        • 2012-05-04
        • 1970-01-01
        相关资源
        最近更新 更多