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。