Простые инструкции (выражения)

Простые инструкции содержат выражения, в частности, присваивание переменным новых значений или результатов вычислений, а также вызовы функций.

Формально синтаксис выглядит так:

выражение ;

Здесь важно наличие точки с запятой в конце. Поскольку исходные коды MQL5 поддерживают свободное форматирование, символ ';' является единственным разделителем, который сообщает компилятору, где закончилась предыдущая инструкция и началась следующая. Как правило, инструкции пишутся на отдельных строках, например, так:

int i = 0j = 1k;   // инструкция объявления
++i;                   // простая инструкция
j += i;                // простая инструкция
k = (i + 1) * (j + 1); // простая инструкция
Print(i" "j);      // простая инструкция

Однако правила не запрещают написать код компактно:

int i=0,j=1;++i;j+=i;k=(i+1)*(j+1);Print(i," ",j);

Если бы не ';', соседние выражения могли бы втихую "склеиваться" и приводить к непреднамеренным результатам. Например, выражение x = y - 10 * z вполне могло бы быть двумя: x = y; и -10 * z; (-10 с унарным минусом). Как такое возможно?

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

i + j// warning: expression has no effect

Компилятор при этом выдает предупреждение "выражение бесполезно" ("expression has no effect"). Возможность конструировать подобные выражения нужна потому, что объектные типы, которые мы освоим в Части 3, позволяют осуществлять перегрузку операций, то есть подменять привычный смысл символов-операторов некими специфическими действиями. Тогда, если тип i и j будет не int, а каким-то классом с переопределенной операцией сложения, такая запись будет иметь эффект, и компилятор не станет выдавать предупреждение.

Простые инструкции можно писать только внутри составных инструкций. Например, вызвать функцию Print за пределами какой-либо функции не получится:

Print("Hello "Symbol());
void OnStart()
{
}

Мы получим целый град ошибок:

'Print' - unexpected token, probably type is missing?
'Hello, ' - declaration without type
'Hello, ' - comma expected
'Symbol' - declaration without type
'(' - comma expected
')' - semicolon expected
')' - expressions are not allowed on a global scope

Самая подходящая, в данном случае, — последняя: "выражения недопустимы в глобальном контексте".