简单语句(表达式)

简单语句包含 表达式,比如为变量赋予新值或计算结果,以及函数调用。

从形式上看,语法如下所示:

expression ;

结尾的分号在这里很重要。因为 MQL5 源代码支持自由格式,所以 ; 是唯一的分隔符,它告诉编译器上一条语句的结束位置和下一条语句的开始位置。语句通常是按行编写,例如,像这样:

int i = 0j = 1k;   // declaration statement
++i;                   // simple statement
j += i;                // simple statement
k = (i + 1) * (j + 1); // simple statement
Print(i" "j);      // simple statement

然而,规则上并不禁止用速记代码编写:

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

编译器发出“表达式无效”警告。允许构建这种表达式是有必要的,因为某些对象类型(我们将在 第三章中学习)允许 运算符重载。即我们可以用一些特定的操作来代替运算符符号的常用含义。如果 ij 的类型不是 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

在本例中,最后一条错误最切题:“表达式不允许在全局上下文中使用。”