while 循环结构

该循环结构用 while 关键字描述。只要循环结构头中的逻辑表达式为真,它就会重复执行受控语句。

while ( condition )
  loop body

条件是布尔类型的任意表达式。必须存在条件。如果在循环结构开始前条件为 false,循环将永远不会执行。

与 C++ 不同,MQL5 不支持在 while 循环头中定义变量。

条件中包含的变量必须在循环结构之前定义。

循环体可以是简单语句,也可以是复合语句。

未定义迭代次数时,通常使用 while 循环结构。例如,要编写一个每秒输出计算机计时器计数的循环结构,可以使用 while 循环结构并检查停止标志(通过调用 IsStopped 函数),如下所示(StmtLoopsWhile.mq5):

while(!IsStopped())
{
   Comment(GetTickCount());
   Sleep(1000);
}
Comment("");

此外,当循环终止条件可以与表达式中的变量修改组合时,使用 while 循环结构会非常方便。依次执行下一个循环,直到变量 i 为零(0 被视为 false)。

int i = 5;
while(--i// warning: expression not boolean
{
   Print(i);
}

但是,在这种情况下,头表达式不是布尔型的(并且被隐式转换为 falsetrue)。编译器生成相关警告。创建表达式时,最好始终考虑预期的(根据规则)特征。以下是正确的循环结构版本:

int i = 5;
while(--i > 0)
{
   Print(i);
}

循环结构也可以与简单语句(无代码块)一起使用:

while(i < 10)
   Print(++i);

注意,一条简单的语句以分号结束。它还表明,头中检查变量的更改是在循环结构内部进行的。

使用循环时,务必谨慎使用无符号整数。例如,下一个循环永远不会结束,因为它的条件始终为真(理论上,编译器可以在这些地方发出警告,但实际并没有)。在零之后,计数器会“变成”一个很大的正数 (UINT_MAX),循环继续。

uint i = 5;
while(--i >= 0)
{
   Print(i);
}

从用户的角度来看,MQL 程序会冻结(停止响应命令),但仍然会消耗资源(处理器和内存)。

while 循环结构可以像其他类型的重复语句一样嵌套。