Операции и выражения

Некоторым символам и символьным последовательностям придается особое значение. Это — так называемые символы операций, например:

+ — * / % — символы арифметических операций

&& || — символы логических операций

= += *=символы операций присваивания

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

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

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

Выражения

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

Примеры:

a++; 
b = 10;
c = (m * k) / (d + 2) + 178;

Выражение, заканчивающееся точкой с запятой (;), является оператором.

Арифметические операции

К арифметическим относятся аддитивные и мультипликативные операции:

Сумма величин: g = x + 13;

Вычитание величин: m = h — 9;

Изменение знака: y = — y;

Умножение величин: e = 6 * j;

Частное от деления: d = t / 4;

Остаток от деления: div_ost = t % 24;

Увеличить значение переменной на единицу: p++;

Уменьшить значение переменной на единицу: s—;

Операции увеличения/уменьшения значения переменной не могут применяться в выражениях.

Примеры:

int k=16;
z++; // верное выражение
int x=(m++)*4; // неверное выражение

Операция присваивания

Значением выражения, в которое входит операция присваивания, является значение левого операнда после присваивания:

Присваивание значения x переменной y: у = x;

Следующие операции объединяют арифметические или побитовые операции с операцией присваивания:

Увеличение значения переменной у на x: у += x;

Уменьшение значения переменной y на x: y -= x;

Умножение значения переменной y на x: y *= x;

Деление значения переменной y на x: y /= x;

Остаток от деления значения переменной y на x: y %= x;

Сдвиг двоичного представления y вправо на x бит: y >>= x;

Сдвиг двоичного представления y влево на x бит: y <<= x;

Побитовая операция И двоичных представлений y и x: y &= x;

Побитовая операция ИЛИ двоичных представлений y и x: y |= x;

Побитовая операция исключающее ИЛИ двоичных представлений y и x: y ^= x;

В выражении может быть только одна операция присваивания. Побитовые операции производятся только с целыми числами. При выполнении операции логический сдвиг представления y вправо/влево на x бит используются младшие 5 двоичных разрядов значения x, старшие разряды отбрасываются, то есть сдвиг производится на 0-31 бит. При выполнении операции %= (значение y по модулю x) знак результата совпадает со знаком делимого.

Булевые операции

Логическое выражение в программировании — конструкция языка программирования, результатом вычисления которой является «истина» или «ложь».

В большинстве языков программирования низкого и высокого уровня определён набор встроенных операций сравнения позволяющих строить «простые» логические выражения. Самыми распространёнными являются:

Операция MQL
Равно ==
Не равно !=
Больше >
Меньше <
Больше или равно >=
Меньше или равно <=

Например, логическое выражение «5 > 3» истинно, а «6 != 6» ложно.

Истина, если a равно b: a == b;

Истина, если a не равно b: a != b;

Истина, если a меньше b: a < b;

Истина, если a больше b: a > b;

Истина, если a меньше или равно b: a <= b;

Истина, если a больше или равно b: a >= b;

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

Логические операции

Операнд операции логического отрицания «НЕ»(!) должен иметь арифметический тип. Результат равен ИСТИНА(1), если значение операнда есть ЛОЖЬ(0), и равен ЛОЖЬ(0), если операнд не равен ЛОЖЬ(0).

if(!b) 
   Print("не 'b'");

Логическая операция «ИЛИ» (||) значений x и y. Значением выражения является ИСТИНА(1), если истинно (не нуль) значение x или y. В противном случае — ЛОЖЬ(0).

if(z<0 || z>=max_bars) 
   Print("out of range");

Логическая операция «И» (&&) значений x и y. Значением выражения является ИСТИНА(1), если значения x и y истинны (не нуль). В противном случае — ЛОЖЬ(0). Логические выражения вычисляются полностью, т.е., к ним не применяется схема так называемой «короткой оценки».

if(m!=x && m>y) 
   Print("TRUE");

Битовые операции

Дополнение до единицы значения переменной. Значение выражения содержит 1 во всех разрядах, в которых значение переменной содержит 0, и 0 во всех разрядах, в которых значения переменной содержит 1.

b = ~n;

Двоичное представление x сдвигается вправо на y разрядов. Сдвиг вправо логический, то есть освобождающиеся слева разряды будут заполняться нулями.

x = x >> y;

Двоичное представление x сдвигается влево на y разрядов; освобождающиеся справа разряды заполняются нулями.

x = x << y;

Побитовая операция И двоичных представлений x и y. Значение выражения содержит 1 (ИСТИНА) во всех разрядах, в которых и x, и y содержат не ноль; и 0 (ЛОЖЬ) во всех остальных разрядах.

b = ((x & y) != 0);

Побитовая операция ИЛИ двоичных представлений x и y. Значение выражения содержит 1 во всех разрядах, в которых x или y не содержит 0, и 0 — во всех остальных разрядах.

b = x | y;

Побитовая операция исключающее ИЛИ (eXclusive OR) двоичных представлений x и y. Значение выражения содержит 1 в тех разрядах, в которых x и y имеют разные двоичные значения, и 0 — во всех остальных разрядах.

b = x ^ y;

Побитовые операции выполняются только с целыми числами

Другие операции

Индексирование
При обращении к i-му элементу массива значением выражения является значение переменной с порядковым номером i.

Пример:

dim_array[i] = 7; // Присвоить значение 7 i-му элементу массива dim_array.

Индексом массива может быть только целое число. Допускаются не более чем четырехмерные массивы. Индексация каждого измерения производится от 0 до размер измерения-1. В частном случае одномерного массива из 50 элементов обращение к первому элементу будет выглядеть как array[0], к последнему элементу — array[49].

При доступе за пределы массива исполняющая подсистема сгенерирует ошибку ERR_ARRAY_INDEX_OUT_OF_RANGE (4002), которую можно получить при помощи функции GetLastError().

Вызов функции с аргументами x1, x2,…, xn
Каждый аргумент функции может представлять собой константу, переменную или выражение соответствующего типа. Передаваемые аргументы разделяются запятыми и должны находиться внутри круглых скобок, открывающая круглая скобка должна следовать за именем вызываемой функции.

Значением выражения является значение, возвращаемое функцией. Если тип возвращаемого значения функции есть void, то вызов такой функции нельзя помещать справа в операции присвоения. Обратите внимание, что порядок выполнения выражений x1,…, xn будет обеспечен.

Пример:

double StopLoss   = Bid-70*Point;
double TakeProfit = Ask+120*Point;
int ticket = OrderSend(Symbol(), OP_BUY, 1, Ask, 3,StopLoss, TakeProfit, "Мой ордер на покупку", 4567, 0, Red);

Операция запятая
Выражения, разделенные запятыми, вычисляются слева направо. Все побочные эффекты вычисления левого выражения могут возникать до вычисления правого выражения. Тип и значение результата совпадают с типом и значением правого выражения. В качестве примера можно рассматривать список передаваемых параметров (см.выше).

Пример:

int k = 99;
for(int i=0, i<100; i++, k--) 
   Print(array[i][k]);

Приоритеты и порядок выполнения операций

Для каждой группы операций в таблице приоритет одинаков. Чем выше приоритет группы операций, тем выше она расположена в таблице. Порядок выполнения определяет группировку операций и операндов.

() Вызов функции Слева направо

[] Выделение элемента массива

! Логическое отрицание Справа налево

Изменение знака

++ Увеличение на единицу (increment)

Уменьшение на единицу (decrement)

~ Побитовое отрицание (complement)

& Побитовая операция И Слева направо

| Побитовая операция ИЛИ

^ Побитовая операция исключающее ИЛИ (eXclude OR)

<< Сдвиг влево

>> Сдвиг вправо

* Умножение Слева направо

/ Деление

% Деление по модулю

+ Сложение Слева направо

Вычитание

< Меньше, чем Слева направо

<= Меньше или равно

> Больше, чем

>= Больше или равно

== Равно

!= Не равно

|| Логическая операция ИЛИ Слева направо

&& Логическая операция И Слева направо

= Присваивание Справа налево

+= Сложение с присваиванием

-= Вычитание с присваиванием

*= Умножение с присваиванием

/= Деление с присваиванием

%= Деление по модулю с присваиванием

>>= Сдвиг вправо с присваиванием

<<= Сдвиг влево с присваиванием

&= Побитовое И с присваиванием

|= Побитовое ИЛИ с присваиванием

^= Исключающее ИЛИ с присваиванием

, Запятая Слева направо

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