在完成C编程测试时,我得到了一个关于函数的预期输出的问题,该函数似乎返回两个值。它的结构如下:
int multi_return_args(void)
{
return (44,66);
}
这个问题出乎我的意料,我本能地认为,如果可能的话,第一个参数应该传递给调用者。
但是编译后,结果却是66。在快速搜索之后,我找不到任何关于构造这样的返回语句的东西,所以想知道是否有人可以帮助我。
为什么它的行为像这样,为什么?
逗号操作符对一系列表达式求值。逗号组的值为列表中最后一个元素的值。
在示例中,前面的常量表达式44没有作用,但如果表达式有副作用,就会发生。例如,
return printf( "we're done" ), 66;
在本例中,程序将打印"we're done",然后返回66。
在您的代码中,
return (44,66);
正在使用(mis)逗号操作符属性。在这里,实际上放弃了 ,
操作符的第一个(左侧)操作数,并返回第二个(右侧)操作数的值。
引用C11
标准,第6.5.17章,逗号操作符
逗号操作符的左操作数计算为空表达式;在它的求值和右操作数的求值之间有一个序列点。然后对右操作数求值;结果有其类型和值。
在这种情况下,与写
相同 return 66;
然而,FWIW,左侧操作数作为空表达式求值,这意味着,如果该求值有任何副作用,则会照常发生,但是涉及逗号操作符的语句的整个表达式的结果将具有右侧操作数求值的类型和值。
这将返回66
。返回(44,66)
没有什么特别的。
(44,66)
是一个值为66
的表达式,因此你的函数将返回66
。
阅读更多关于逗号操作符的信息
当表达式中使用多个逗号操作符时,逗号操作符总是返回rightmost operand
的值。它显然会返回66