C函数中逗号分隔的返回参数

时间:2015-08-19 11:27:11

标签: c comma-operator

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

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

这个问题让我感到意外,并且固有地认为如果可能的话,第一个参数将被传递给调用者。

但是在编译之后,结果却是66。经过快速搜索后,我无法找到关于构造这样的返回语句的任何内容,所以想知道是否有人可以帮助我。

为什么它会像这样,为什么?

4 个答案:

答案 0 :(得分:5)

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

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

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

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

答案 1 :(得分:3)

在您的代码中,

 return (44,66);

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

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

  

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

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

 return 66;

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

答案 2 :(得分:2)

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

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

了解更多about the comma operator

答案 3 :(得分:1)

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