repeat 语句

repeat 结构是最简单的一种循环结构:

1
2
3
4
repeat (循环次数)
{
    循环体
}

例如:

1
2
repeat (30)
    instance_create(x, y, objBullet);

这将导致创建 30 个 objBullet。

while 语句

while 语句是用以循环执行某一段代码的语句,其格式为:

1
2
3
4
5
6
while (判定条件)
{
    语句 1;
    语句 2;
    ...
}

只要 while 后小括号里的值判定为 1,就会循环不断地执行花括号里的代码(正数一律视为 1)。所以,这个循环必须要有办法能够停止。如:

1
2
3
4
5
6
7
8
i = 1;
s = 0;
while (i <= 100)
{
    s += i;
    i += 1;
}
show_message(string(s));

这段代码用来计算 1+2+3+...+100 的和并将值存在变量 s 中。

每一次执行花括号中的代码,变量 i 的值就会在自身的基础上再加一,只要 i 小于等于 100,就满足 while 的判定,就会再一次执行花括号内的代码。由于 GM 的代码执行是从上往下按顺序执行,所以循环结束之前,后面的 show_message(string(s)); 是不会执行的。当 i 增加到 101 时,i <= 100 不成立,不满足 while 的判定,循环终止,这时才会执行后面的 show_message(string(s)); 代码。

PS:show_message(string(s)); 这句代码用来弹出一个弹窗,并且将 s 的值显示在弹窗中。

do 语句

do 语句也是用以循环执行代码段的语句,其格式为:

1
2
3
4
5
6
7
do
{
    语句 1;
    语句 2;
    ...
}
until (判定条件);

与 while 相反,该语句只有 until 后小括号内的判定条件为 0 时才会循环执行。将 while 语句改为 do 语句,判定条件要刚好相反。

如,将上面 while 语句的例子改为 do 语句,就变成了:

1
2
3
4
5
6
7
8
9
10
i = 1;
s = 0;
do
{
    s += i;
    i += 1;

}
until (i > 100);    // 此处条件与 while 相反
show_message(string(s));

扩展:

while 和 do 的机制上有差别,即 while 语句先判定后执行代码段,而 do 语句是先执行代码段后判定。

在循环至少会执行一次时,while 与 do 是没有区别的。二者的区别在于当判定条件一次都不满足时。如:

1
2
3
4
5
6
i = 5;
while (i <= 0)
{
    i += 1;
}
show_message(string(i));

1
2
3
4
5
6
7
i = 5;
do
{
    i += 1;
}
until (i > 0);
show_message(string(i));

显然,i = 5 是不满足 i <= 0,所以 while 语句中的代码段是不会执行的,i 的值依然是 5。但是在 do 语句中,是先执行 i += 1,然后再判定 i > 0 的,此时 i = 6,6 > 0,循环终止,所以最后输出的 i 的值是 6。

只要循环的判定条件至少能满足一次以上,while 和 do 是一样的效果,差别仅体现在判定条件一次都满足不了的情况下。

for 语句

for 语句是第三种循环语句。其格式为:

1
2
3
4
5
6
7
for (语句 1; 判定条件; 语句 n)
{
    语句 2;
    语句 3;
    ...
    语句 n-1;
}

for 语句和 while 语句可以完全相互替代,将上 述for 语句改为 while 语句,就是:

1
2
3
4
5
6
7
8
9
语句 1;
while (判定条件)
{
    语句 2;
    语句 3;
    ...
    语句 n-1;
    语句 n;
}

for 语句的好处在于可以将用于控制循环的变量的赋值、判定、自增放在一起,便于阅读。

如,之前举的 while 的例子:

1
2
3
4
5
6
7
8
i = 1;
s = 0;
while (i <= 100)
{
    s += i;
    i += 1;
}
show_message(string(s));

将其改为 for 语句,就是:

1
2
3
4
s = 0;
for (i = 1; i <= 100; i += 1)
    s += i;
show_message(string(s));

使用 for 语句将用于控制循环的变量 i 全部放在一行中,便于阅读。

for 循环中的变量 i 也可以被主体所使用。

break 语句

break 语句的作用是终止整个循环

例如,上述 while 的例子,你可以改成:

1
2
3
4
5
6
7
8
9
10
i = 1;
s = 0;
while (true)
{
    s += i;
    i += 1;
    if (i > 100)
        break;
}
show_message(string(s));

效果是一样的。

把 for 语句改成使用 break 终止循环,如上述例子可以改成:

1
2
3
4
5
6
7
8
s = 0;
for (i = 1; true; i += 1)
{
    s += i;
    if (i > 100)
        break;
}
show_message(string(s));

break 一般写在 if 语句中,否则第一次循环就会执行 break 中断循环。一个循环中可以写多个 break,如:

1
2
3
4
5
6
7
8
9
10
s = 0;
for (i = 1;;i += 1)
{
    s += i;
    if (i > 100)
        break;
    if (s > 1000)
        break;
}
show_message(string(s));

注意,break 语句只能中断一层循环。如:

1
2
3
4
5
6
7
8
9
10
h = 0;
for (i = 1; i <= 100; i += 1)
{
    for (j = 1; j <= 100; j += 1)
    {
        h += i + j;
        if (j > i)
             break;
    }
}

第一次循环时:i = 1,j = 1,h = 0 + i + j = 2,内层 for 语句继续循环:i = 1,j = 2,h = 2 + i + j = 5,此时 j > i,执行 break,注意此时程序只会从第二层循环跳到第一层循环,而不是终止整个循环。跳到第一层循环后,i += 1,故 i = 2,仍然满足 i <= 100,所以再次进入到第二层循环。

continue 语句

continue 语句的作用是使循环体跳过一次代码执行

举个例子来理解:

1
2
3
s = 0;
for (i = 1; i <= 100; i += 1)
    s += i;

这是计算 1 + 2 + 3 +...+ 100 的和的代码,如果你要从中去除 30,你可以这样写:

1
2
3
4
5
6
7
s = 0;
for (i = 1; i <= 100; i += 1)
{
    if (i == 30)
        continue;
    s += i;
}

这样当 i 为 30 时,执行 continue,会跳过本次 s += i,但是并不会终止整个循环,而是 i 再自增变成 31,再进行下一次循环。

注意,由于代码是从上往下执行,所以 continue 只能跳过位于自己下方的代码。如:

1
2
3
4
5
6
7
8
9
s = 0;
t = 0;
for (i = 1; i <= 100; i += 1)
{
    t += i;
    if (i == 30)
        continue;
    s += i;
}

在这里,continue 对 t += i 无法产生影响,t 的最终值是 1 + 2 + 3 +…+ 100 = 5050,而 s 的最终值是 1 + 2 + 3+ …+ 29 + 31 + 32 +…+ 100 = 5020。