7

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

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

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

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

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

4

4 回答 4

9

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

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

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

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

于 2015-08-19T11:35:50.133 回答
5

在您的代码中,

 return (44,66);

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

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

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

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

 return 66;

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

于 2015-08-19T11:29:20.207 回答
2

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

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

阅读有关逗号运算符的更多信息。

于 2015-08-19T11:30:02.303 回答
1

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

于 2015-08-19T11:38:21.267 回答