函数中的多个返回值

ego*_*or7 5 c c++

我面对下一个样本:

#include <stdio.h>

// test multiple return                                                                                                                                                             
int foo()
{
    return 1,2,3,4,5,6;
}

// main entry point                                                                                                                                                                 
int main(int argc, char* argv[])
{
    printf("foo returns: %d\n", foo());
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

编译它,然后运行:

gcc main.cpp -o main
./main
Run Code Online (Sandbox Code Playgroud)

结果令我困惑:

foo returns: 6
Run Code Online (Sandbox Code Playgroud)

问题是:为什么没有编译时错误?

Mys*_*ial 11

在这方面:

return 1,2,3,4,5,6;
Run Code Online (Sandbox Code Playgroud)

实际上是逗号运算符.它按顺序(从左到右)评估逗号之间的所有内容,并返回最后一个.

这就是它返回和打印的原因6.是的,它是有效的代码.这就是没有编译器错误的原因.(虽然1,2,3,4,5在这种情况下该部分不做任何事情.)

在C和C++中,您不能返回多个值.你必须使用结构或类来做到这一点.


Bas*_*tch 10

因为您正在使用逗号运算符:表达式a,bwhere ab是任意(通常是副作用)子表达式意味着:评估左侧a并丢弃其结果(因此a仅评估副作用),然后评估b并给出结果.

您无法从C函数返回多个内容.您应该返回例如聚合(通常是a struct)或动态堆分配的指针.

至于问题,编译器为什么不说什么?因为你没有问过它.你真的应该编译gcc -Wall(对于C代码)或g++ -Wall(对于C++代码),然后你得到警告:

 egor7.c: In function ‘foo’:
 egor7.c:6:13: warning: left-hand operand of comma expression has no effect [-Wunused-value]
 egor7.c:6:15: warning: left-hand operand of comma expression has no effect [-Wunused-value]
 egor7.c:6:17: warning: left-hand operand of comma expression has no effect [-Wunused-value]
 egor7.c:6:19: warning: left-hand operand of comma expression has no effect [-Wunused-value]
 egor7.c:6:21: warning: left-hand operand of comma expression has no effect [-Wunused-value]
Run Code Online (Sandbox Code Playgroud)