C 函数中以逗号分隔的 return 个参数

Comma-Separated return arguments in C function

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

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

这个问题让我很吃惊,并且本能地认为如果可能的话,第一个参数将被传递给调用者。

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

为什么会这样,为什么?

在您的代码中,

 return (44,66);

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

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

The left operand of a comma operator is evaluated as a void expression; there is a sequence point between its evaluation and that of the right operand. Then the right operand is evaluated; the result has its type and value.

这种情况下,与写法一样

 return 66;

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

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

(44,66) 是一个具有值 66 的表达式,因此您的函数将 return 66.

阅读更多about the comma operator

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

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

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

在这种情况下,程序将打印 "we're done" 然后 return 66.

当在一个表达式中使用多个逗号运算符时,

逗号运算符始终 return 是 rightmost operand 的值。 显然会 return 66.