【问题标题】:Comma-Separated return arguments in C function [duplicate]C函数中逗号分隔的返回参数[重复]
【发布时间】:2015-11-12 16:12:52
【问题描述】:

在完成 C 编程测试时,我收到了一个关于函数的预期输出的问题,该函数似乎返回两个值。它的结构如下:

int multi_return_args(void)
{
 return (44,66);
}

这个问题让我大吃一惊,并固有地认为如果可能,第一个参数将传递给调用者。

但是编译之后,结果却是66。快速搜索后,我找不到任何关于构造这样的 return 语句的信息,所以想知道是否有人可以帮助我。

为什么会这样,为什么?

【问题讨论】:

标签: c comma-operator


【解决方案1】:

逗号运算符计算一系列表达式。逗号组的值是列表中最后一个元素的值。

在示例中,您显示前导常量表达式 44 没有效果,但如果表达式有副作用,它就会发生。例如,

return printf( "we're done" ), 66;

在这种情况下,程序会打印“我们完成了”,然后返回 66。

【讨论】:

  • 感谢您的解释,我之前还没有真正以这种方式使用过逗号属性运算符。我开始想出一些非常复杂的想法,它是如何工作的。有关如何使用它的更多示例可以在此线程中显示What does the comma operator `,` do in C
【解决方案2】:

在您的代码中,

 return (44,66);

正在 (mis) 使用 comma operator 属性。在这里,它基本上丢弃, 运算符的第一个(左侧)操作数,并返回第二个(右侧操作数)的值。

引用C11 标准,第 §6.5.17 章,逗号运算符

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

在这种情况下,它与写作相同

 return 66;

但是,FWIW,左侧操作数被评估为 void 表达式,这意味着,如果该评估有任何副作用,那将照常发生,但结果涉及逗号运算符的语句的整个表达式将具有右侧操作数的评估类型和值。

【讨论】:

    【解决方案3】:

    这将返回66。返回(44,66) 并没有什么特别之处。

    (44,66) 是一个值为66 的表达式,因此您的函数将返回66

    阅读更多about the comma operator

    【讨论】:

      【解决方案4】:

      当在表达式中使用多个逗号运算符时,逗号运算符始终返回 rightmost operand 的值。 它显然会返回 66。

      【讨论】:

        猜你喜欢
        • 2014-09-02
        • 1970-01-01
        • 1970-01-01
        • 2015-10-06
        • 2020-01-10
        • 1970-01-01
        • 2011-12-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多