我面对下一个样本:
#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,b
where a
和b
是任意(通常是副作用)子表达式意味着:评估左侧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)