Переход return

Оператор return предназначен для возврата управления из функций. Учитывая, что все исполняемые инструкции находятся внутри той или иной функции, он может опосредованно использоваться для прерывания содержащих его циклов for, while и do любого уровня вложенности. При этом следует учитывать, что в отличие от continue и, тем более, break все инструкции, следующие за прерванными циклами внутри функции, также будут проигнорированы.

Синтаксис оператора return:

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

Необходимость указывать выражение определяется сигнатурой функции (подробнее об этом будет рассказано в соответствующем разделе). Для общего понимания работы return в контексте управляющих инструкций ограничимся примером с главной функцией скриптов OnStart. Поскольку она имеет тип void, то есть ничего не возвращает, оператор для неё принимает форму:

return ;

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

С помощью оператора return это можно сделать проще (StmtJumpReturn.mq5).

void OnStart()
{
   string s = "Hello, " + Symbol();
   const int n = StringLen(s);
   for(int i = 0i < n; ++i)
   {
      for(int j = i + 1j < n; ++j)
      {
         if(s[i] == s[j])
         {
            PrintFormat("Duplicate: %c"s[i]);
            return;
         }
      }
   }
   
   Print("No duplicates");
}

При обнаружении равенства в операторе if — отображаем символ и завершаем работу функции. Если бы данный алгоритм находился в пользовательской функции, отличной от OnStart, мы могли бы определить для неё тип возвращаемого значения (например, ushort вместо void) и передавать найденный символ с помощью полной формы return в вызывающий код.

Поскольку в тестовой строке заведомо существует задвоенная буква 'l', инструкция после циклов (Print), не будет выполнена.