返回值

函数可以返回内置类型的值,包含内置类型字段的 结构体 ,以及 指向函数的指针 和指向 对象的指针。类型名写在函数定义中的名称之前。如果函数不返回任何内容,则应被赋予 void 类型。

若要从数组函数返回,必须使用通过引用传递的参数(请参见 值参数和引用参数)。

使用 return 语句返回一个值,其中在 return 关键字后指定了一个表达式。可以使用两种形式中的任何一种:

return expression ;

或者:

return ( expression ) ;

如果函数的类型为 void,那么 return 语句将简化为:

return ;

return 语句不能在 void 函数内部包含任何表达式:编译器将生成一个错误“'return' - 'void' 函数返回一个值”。

对于这样的函数,理论上不需要在函数体的代码块结尾使用 return。我们在 OnStart 函数的例子中看到了这一点。

如果函数的类型不是 void,那么必须用 return 语句。如果不存在,将出现编译错误“并非所有控制路径都返回值”。

int func(void)
{
   if(IsStopped()) return// error: function must return a value
                           // error: not all control paths return a value  
}

需要注意的是,一个函数体可以有多个 return 语句。特别是在根据条件而提前退出的情况下。任何 return 语句都会在其所在的位置中断函数的执行。

如果函数必须返回一个值(因为它不是 void 类型函数),并且没有在 return 运算符中指定,编译器将生成错误“函数必须返回一个值”。下面给出了 func 函数的编译器更正版本 (FuncReturn.mq5)。

int func(void)
{
   if(IsStopped()) return 0;
   return 1;
}

如果返回值与指定的函数类型不一致,编译器将尝试进行 隐式转换。如果类型需要显式转换,将会生成错误。

为了返回值,会隐式创建一个临时变量,并提供给调用代码使用。

在我们学习了对象类型(参见 一章)和从函数返回对象指针的功能后,我们将回头分析如何安全地传递对象指针。与 C++ 不同,MQL5 中的函数不能返回引用。试图在结果类型中声明带有 & 符号的函数会导致错误“不能使用 & 引用”。