分支与循环

分支

if 分支语句

if 分支有两种形式,一种是 if-then,一种是 if-then-else

if-then 语句的表现形式如下:

1
2
if 条件 then
单条语句;

if-then 语句的复合表现形式如下:

1
2
3
4
5
6
if 条件 then begin
语句1;
语句2;
...
语句n;
end;

if-then-else 语句的表现形式如下:

1
2
3
4
if 条件 then
单条语句 // 注意 else 的前一条语句不能有分号
else
单条语句;

if-then-else 语句的复合表现形式如下:

1
2
3
4
5
6
7
8
9
10
11
12
if 条件 then begin
语句1;
语句2;
...
语句n;
end // 注意 else 的前的 end 不能有分号
else begin
语句1;
语句2;
...
语句n;
end;

每个 else 后面又可以跟 if 语句,组合成无限的 if-else-if 的形式

1
2
3
4
5
6
7
8
9
10
11
12
if 条件1 then 
语句1
else if 条件2 then
语句2
else if 条件3 then
语句3
。。。
else if 条件n then
语句n
else
语句n+1
end;

case 分支语句

case 用于选择语句,表现形式如下:

1
2
3
4
5
6
case 选择表达式 of
常量1: 语句1;
常量2: 语句2;
...
常量n: 语句n;
end;

上述 case 语句相当于 C 语言的 switch..case 语句。

C 语言的常量匹配之后,需要加上 break 来跳出选择,否则会继续执行后面的条件处理语句。Delphi 不需要这样,Delphi 只会执行指定的条件处理语句。

带缺省处理的 case 语句表现形式如下:

1
2
3
4
5
6
7
8
case 选择表达式 of
常量1: 语句1;
常量2: 语句2;
...
常量n: 语句n; // case 语句中的 else 前面可以带分号
else
缺省处理语句;
end;

case 语句中的处理语句可以使用 begin .. end 复合语句。

多值匹配的表现形式如下:

1
2
3
4
5
6
case 选择表达式 of
常量1, 常量2, 常量3: 语句A;
常量4, 常量5, 常量6: 语句B;
...
常量n, 常量n+1 : 语句N;
end;

循环

while 循环

while 循环语句的表现形式如下:

1
2
while 条件表达式 do
语句;

while 循环语句复合语句表现形式如下:

1
2
3
4
5
6
7
while 条件表达式 do
begin
语句1;
语句2;
...
语句n;
end;

当条件成立时,执行循环体语句。

repeat 循环

repeat .. until 循环语句的表现形式如下:

1
2
3
4
5
6
repeat
语句1;
语句2;
...
语句n;
until 条件表达式;

先执行一次循环体,然后判断条件表达式,成立的话,则结束循环;不成立的话,继续循环。

  • repeat .. until 跟 C 语言的 do .. while 的循环很相似,至少会执行一次循环体
  • 但是 Delphi 是判断条件成立时结束循环, C 语言是判断条件成立时继续循环;刚好相反。

for 循环

for 循环语句的表现形式如下:

1
2
for 计数器 := 初值 to/downto 终值 do
语句;

for 循环语句复合语句表现形式如下:

1
2
3
4
5
6
7
for 计数器 := 初值 to/downto 终值 do
begin
语句1;
语句2;
...
语句n;
end;
  1. to 终值 时:
  • 先执行计数器的初始化
  • 计数器与终值比较,如果计数器小于或者等于终值,执行循环体
  • 计数器自增 1
  • 循环结束后,计数器的值为终值 + 1
  1. downto 终值 时:
  • 先执行计数器的初始化
  • 计数器与终值比较,如果计数器大于或者等于终值,执行循环体
  • 计数器自减 1
  • 循环结束后,计数器的值为终值 - 1

其他tips:

  • 对于 for 语句而言,当初值与终值相等时,系统只执行一次循环。
  • 计数器必须是有序类型

C 语言的 for 循环相比,Delphifor 循环的弹性比较小,每次循环的变化量只能单步加 1 或者减 1,但是 Delphi 的可阅读性更好。需要特殊变化处理的循环,可以用 repeatwhile 处理。

for-in 循环

for-in 循环可以用于数组、列表、字符串等一系列容器的遍历。与 C# 不同的是,并不要求实现 IEnumerator 这个接口,但编译器内部会以相似的作法来实现。

for-in 循环语句的表现形式如下:

1
2
for 变量 in 集合 do
语句;

for 循环语句复合语句表现形式如下:

1
2
3
4
5
6
7
for 变量 in 集合 do
begin
语句1;
语句2;
...
语句n;
end;

break 和 continue

  • break 用来终止循环
  • continue 用来结束当次循环,重新进行循环判断

goto

goto 语句用于绝对跳转到指定的标签。一般用于跳出多重循环。表现形式如下:

1
goto 标签;

标签是一个范围 0~9999 的数字。具体使用需要先用 label 语句声明标签列表,然后在程序代码中插入标签。例子如下:

1
2
3
4
5
6
7
8
9
10
11
    label 1,2,3;        // 先声明标签 1,2,3 三个
语句1;
语句2;
1: 语句3;
语句4;
2: 语句5;
语句6;
3: 语句7;
语句8;
....
goto 2; // 跳转到标签 2