在完成C编程测试时,我得到了一个关于函数的预期输出的问题,该函数似乎返回两个值.其结构如下:
int multi_return_args(void)
{
return (44,66);
}
Run Code Online (Sandbox Code Playgroud)
这个问题让我感到惊讶并且固有地认为如果可能的话,第一个参数将被传递给调用者.
但在编译之后,结果是66.在快速搜索之后,我找不到任何关于构造这样的return语句的内容,所以想知道是否有些人可以帮助我.
为什么它会像这样,为什么?
逗号运算符计算一系列表达式.逗号组的值是列表中最后一个元素的值.
在示例中,您显示前导常量表达式44无效,但如果表达式有副作用,则会发生.例如,
return printf( "we're done" ), 66;
Run Code Online (Sandbox Code Playgroud)
在这种情况下,程序将打印"我们已完成",然后返回66.
在您的代码中
return (44,66);
Run Code Online (Sandbox Code Playgroud)
正在(误用)逗号运算符属性。在这里,它实质上丢弃,
运算符的第一个(左侧)操作数,并返回第二个运算符(右侧操作数)的值。
要引用该C11
标准,请参见第6.5.17章,逗号运算符
逗号运算符的左操作数被评估为void表达式;在它的评估与正确操作数的评估之间存在一个顺序点。然后评估正确的操作数;结果具有其类型和价值。
在这种情况下,与写作相同
return 66;
Run Code Online (Sandbox Code Playgroud)
但是,对于FWIW,左侧操作数将作为无效表达式求值,这意味着,如果该求值有任何副作用,它将照常发生,但是涉及逗号运算符的语句的整个表达式的结果将是具有右侧操作数求值的类型和值。