Простые инструкции (выражения)
Простые инструкции содержат выражения, в частности, присваивание переменным новых значений или результатов вычислений, а также вызовы функций.
Формально синтаксис выглядит так:
выражение ; |
Здесь важно наличие точки с запятой в конце. Поскольку исходные коды MQL5 поддерживают свободное форматирование, символ ';' является единственным разделителем, который сообщает компилятору, где закончилась предыдущая инструкция и началась следующая. Как правило, инструкции пишутся на отдельных строках, например, так:
int i = 0, j = 1, k; // инструкция объявления
|
Однако правила не запрещают написать код компактно:
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());
|
Мы получим целый град ошибок:
'Print' - unexpected token, probably type is missing?
|
Самая подходящая, в данном случае, — последняя: "выражения недопустимы в глобальном контексте".