Возврат значений

Функции способны возвращать значения встроенных типов, структуры с полями встроенных типов, а также указатели на функции и указатели на объекты классов. Название типа пишется в определении функции перед именем. Если функция ничего не возвращает, ей следует приписать тип void.

Для возврата из функции массивов необходимо использовать параметры, передаваемые по ссылке (см. Параметры-значения и параметры-ссылки).

Возврат значения производится с помощью инструкции return, в которой после ключевого слова return указывается выражение. Допустимо применять любую из двух форм:

return выражение ;

или:

return ( выражение ) ;

Если функция имеет тип void, то инструкция return упрощается:

return ;

Нельзя указывать в инструкции return какое-то выражение внутри void-функции: компилятор выдаст ошибку "'void' функция возвращает значение" ("'return' - 'void' function returns a value").

Для подобных функций, в принципе, не обязательно использовать return в конце блока с телом функции. Мы это видели на примере функции OnStart.

Если же функция имеет тип, отличный от void, то инструкция return должна быть обязательно. При её отсутствии возникнет ошибка компиляции "не все пути исполнения возвращают значение" ("not all control paths return a value").

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

Важно отметить, что тело функции может иметь несколько операторов return. В частности, при досрочных выходах по условию. Любой оператор return прерывает выполнение функции в том месте, где он находится.

Если функция должна вернуть значение (т.к. она не типа void), а в операторе return оно не указано, компилятор выдаст ошибку "функция должна вернуть значение" ("function must return a value"). Корректная с точки зрения компилятора версия функции func приведена ниже (FuncReturn.mq5).

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

Если возвращаемое значение отличается от указанного типа функции, компилятор сделает попытку неявного приведения типов. В случае, если типы требуют явного преобразования, будет сгенерирована ошибка.

Для возврата значения неявно создается временная переменная, которая становится доступной в вызывающем коде.

Когда мы изучим объектные типы (см. главу про Классы) и возможность возвращать указатели на объекты из функций, мы вернемся к нюансам их безопасной передачи. В отличие от C++, функции в MQL5 не способны возвращать ссылки. Попытка описать функцию с амперсандом в типе результата приводит к ошибке "ссылка не может использоваться" ("'&' - reference cannot used").