Операторы MQL

Все операторы языка MQL описывают некоторые алгоритмические действия и могут быть условно разделены на следующие категории:

  • условные операторы, к которым относятся оператор условия if и оператор выбора switch;
  • операторы цикла (for, while);
  • операторы перехода (break, continue, return);
  • другие операторы (оператор «выражение», пустой оператор).

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

Все операторы языка MQL , кроме составных операторов, заканчиваются точкой с запятой «;».

Один оператор может занимать одну или более строк. Два или большее количество операторов могут быть расположены на одной строке. Операторы, управляющие порядком выполнения (if, if-else, switch, while и for), могут быть вложены друг в друга.

Пример:

if(Month() == 12)
   if(Day() == 31) 
     Print("Happy New Year!");

Составной оператор

Составной оператор (блок) состоит из одного или большего числа операторов любого типа, заключенных в фигурные скобки { }. После закрывающейся фигурной скобки не должно быть точки с запятой (;).

Пример:

if(x==0)
{
   Print("invalid position x=",x);
   return;
}

Оператор-выражение

Любое выражение, заканчивающееся точкой с запятой (;) является оператором. Далее следуют примеры операторов-выражений.

Оператор присваивания:

Идентификатор = выражение;

x=3;
y=x=3; // ошибка

В выражении оператор присваивания может использоваться только один раз.

Оператор вызова функции:

Имя_функции (аргумент1,…, аргументN);

FileClose(file);

Пустой оператор
Состоит только из точки с запятой (;) и используется для обозначения пустого тела управляющего оператора

Оператор завершения break

Использование оператора break позволяет в необходимый момент прервать последовательность выполняемых операторов в теле оператора switch, путем передачи управления оператору, следующему за switch.

Пример:

// поиск первого нулевого элемента
for(i=0;i<array_size;i++)
   if(array[i]==0)
      break;

Оператор продолжения continue

Оператор continue вызывает переход к следующей итерации цикла, т.е. к очередной проверке условия. Естественно, все операторы тела цикла, находящиеся между continue и концом тела цикла пропускаются. Этот оператор по действию противоположен оператору break.

Пример:

// сумма всех ненулевых элементов
int func(int array[])
{
   int array_size=ArraySize(array);
   int sum=0;
   for(int i=0;i<array_size; i++)
   {
       if(a[i]==0) continue;
       sum+=a[i];
   }
   return(sum);
}

Оператор возврата return

Оператор возврата return заканчивает выполнение функции, в которой он содержится, и возвращает управление в вызывающую функцию. Управление передается в точку вызывающей функции, непосредственно следующую за оператором вызова. Значение <выражения>, если оно задано, вычисляется, приводится к типу, объявленному для функции, содержащей оператор возврата return , и возвращается в вызывающую функцию. Если <выражение> опущено, то возвращаемое функцией значение не определено.

Пример:

int CalculateSum(int x, int y)
{
   return(x+y);
}

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

void HelloFunction()
{
   Print("Hello!");
   return; // этот оператор можно удалить, т.к. функция с типом void не возвращает значений
}

Завершающая фигурная скобка функции предполагает неявное исполнение оператора return без выражения.

Условный оператор if-else

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

К примеру, мы вводим с клавиатуры целое число. Если это число больше десяти, то программа должна выполнить одно действие, иначе — другое.

Таким образом, если выражение истинно, то выполняется оператор1 и управление передается на оператор, следующий за оператором2 (т. е. оператор2 не выполняется). Если выражение ложно, то выполняется оператор2.

if (выражение)

оператор1

else

оператор2

Часть else оператора if может опускаться. Поэтому во вложенных операторах if с пропущенной частью else может возникнуть неоднозначность. В этом случае else связывается с ближайшим предыдущим оператором if в том же блоке, не имеющим части else.

Примеры:

// Часть else относится ко второму оператору if:
if(x>1)
   if(y==2) 
     z=5;
   else z=6;
// Часть else относится к первому оператору if
if(x>l)
{ 
   if(y==2) 
      z=5;
} 
else z=6;
// Вложенные операторы
if(x=='a')
{
   y=1;
}
else 
if(x=='b')
{
   y=2;
   z=3;
}
else
if(x=='c')
{
   y = 4;
}
else Print("ERROR");

Оператор-переключатель switch

Тело оператора switch состоит из ряда меток case и необязательной метки default. Никакие два константных выражения в операторах case не могут иметь одно и то же значение. Метка default может появляться только один раз. Операторы с меткой не являются синтаксическим требованием, однако без них инструкция switch не имеет значения. Оператор по умолчанию не всегда стоит в конце; он может отображаться в любой части оператора switch . Метка case или default может отображаться только внутри оператора switch.

Константное-выражение в каждой метке случая преобразуется в тип выражение и сравнивается с выражением на равенство. Управление передается оператору, у которого константное-выражение случая соответствует значению выражения. Поведение, полученное в результате, показано в следующей таблице.

Поведение оператора switch

Условие Действие
Преобразованное значение соответствует значению выражения управления с повышенным уровнем. Управление передается оператору, следующему за этой меткой.
Ни одна из констант не соответствуют константам в метках случаев; метка default присутствует. Управление передается метке default.
Ни одна из констант не соответствуют константам в метках случаев; метка default не присутствует. Управление передается оператору, следующему за оператором switch.

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

switch(выражение)

{

case константа: операторы

case константа: операторы

default: операторы

}

Операторы, связанные с меткой default, выполняются, если ни одна из констант в операторах case не равна значению выражения. Вариант default обязательно должен быть последним. Если ни одна константа не соответствует значению выражения и вариант default отсутствует, то не выполняется никаких действий. Ключевое слово case вместе с константой служат просто метками, и если будут выполняться операторы для некоторого варианта case, то далее будут выполняться операторы всех последующих вариантов до тех пор, пока не встретится оператор break, что позволяет связывать одну последовательность операторов с несколькими вариантами.

Константное выражение вычисляется в период компиляции. Никакие две константы в одном операторе-переключателе не могут иметь одинаковые значения.

Пример:

switch(x)
{
   case 'A':
     Print("CASE A");
     break;
   case 'B':
   case 'C':
     Print("CASE B or C");
     break;
   default:
     Print("NOT A, B or C");
     break;
}

Оператор цикла while

С помощью данного оператора реализуется цикл, который выполняется до тех пор, пока истинно условие цикла.

while(выражение)

оператор;

Значение выражения определяется до выполнения оператора. Следовательно, если выражение ложно с самого начала, то оператор вообще не выполняется.

Пример:

while(k<n)
{
   y=y*x;
   k++;
}

Оператор цикла for

Часто при организации цикла требуется перебирать значение счетчика в заданном диапазоне значений и с заданным шагом изменения. Например, чтобы перебрать элементы вектора (массива), нужно организовать счетчик от 1 до N с шагом 1, где N – число элементов вектора. Чтобы вычислить сумму ряда, также задается счетчик от a до b с требуемым шагом изменения step. И так далее. В связи с тем, что подобные задачи часто встречаются в практике программирования, для их реализации был предложен свой оператор цикла for, который позволяет проще и нагляднее реализовывать цикл со счетчиком.

Выражение1 описывает инициализацию цикла. Выражение2 — проверка условия завершения цикла. Если оно истинно, то выполняется оператор тела цикла for. Все повторяется, пока выражение2 не станет ложным. Если оно ложно, цикл заканчивается и управление передается следующему оператору. ВыражениеЗ вычисляется после каждой итерации.

for(выражение1; выражение2; выражение3)

оператор;

Оператор for эквивалентен следующей последовательности операторов:

выражение1;

while(выражение2)

{

оператор;

выражение 3;

};

Любое из трех или все три выражения в операторе for могут отсутствовать, однако разделяющие их точки с запятыми (;) опускать нельзя. Если опущено выражение2, то считается, что оно постоянно истинно. Оператор for(;;) представляет собой бесконечный цикл, эквивалентный оператору while(1). Каждое из выражение1 и выражение3 может состоять из нескольких выражений, объединенных оператором запятая ‘,’.

Примеры:

for(x=1;x<=7;x++) 
   Print(MathPower(x,2));
for(;;)
{
   Print(MathPower(x,2));
   x++;
   if(x>10) 
     break;
}
for(i=0,j=n-l;i<n;i++,j--) 
   a[i]=a[j];