Object Pascal 学习笔记,Delphi 11 编程语言的完整介绍 作者: Marco Cantu 笔记:豆豆爸
3.5.2 使用Break和Continue语句改变执行流程
尽管每种循环之间存在一定差异,但是每种循环都允许您基于一定规则多次执行一组语句。但是,在某些情况下,您可能希望添加一些额外的行为。例如,假设您有一个for
循环,其中搜索给定字母的出现次数(此代码是FlowTest
示例的一部分):
var
S: string;
I: Integer;
Found: Boolean;
begin
S := 'Hello World';
Found := False;
for I := Low(S) to High(S) do
if S[I] = 'o' then
Found := True;
最后,您可以检查found
的值,以查看给定的字母是否是字符串的一部分。问题是,程序会不断重复循环,即使在找到一个给定的字符后仍然要继续查找该字符(这在字符串很长的情况下是个问题)。
一个经典的替代方法是将其转换为 while 循环,同时检查两个条件(循环计数器和 Found 的值):
var
S: string;
I: Integer;
Found: Boolean;
begin
S := 'Hello World';
Found := False;
I := Low(S);
while not Found and (I < = High(S)) do
begin
if S[I] = 'o' then
Found := True;
Inc(I);
end;
虽然这段代码逻辑性和可读性强,但需要的代码量较多,而且如果条件变得多样化和复杂,将所有各种选项组合在一起将使代码非常难以理解。
这就是为什么这种语言(或更确切地说,其运行时支持)提供系统过程(system procedure)允许您改变循环执行的标准流程:
Break
过程中断循环,直接跳到循环体后的第一条语句,结束循环执行。Continue
过程跳转到循环测试或计数器增量,继续循环的下一次迭代(除非条件不再为真或计数器达到其最大值)。
使用Break
操作,我们可以修改原始匹配字符的循环如下:
var
S: string;
I: Integer;
Found: Boolean;
begin
S := 'Hello World';
Found := False;
for I := Low(S) to High(S) do
if S[I] = 'o' then
begin
Found := True;
Break; // 跳出for循环
end;
另外两个系统过程Exit
和Halt
,让您立即从当前函数或过程返回或终止程序。我将在下一章中介绍Exit
,而实际上没必要调用Halt
,因为它会突然终止程序(因此我不会在书中真正讨论它)。
难道Goto语句来了?不会!
实际上,除了上面介绍的四个系统过程之外,还有更多的方式来中断程序执行流程。最初的 Pascal 语言的特点之一就是臭名昭著的 goto
语句,,该语句允许你在源代码的任何一行附加一个标签,并从程序的另一个位置跳转到该行。条件语句和循环语句都揭示了为什么要偏离顺序代码流,而 goto 语句则不同,它一般看起来像不规则的跳转,而且确实是完全不受欢迎的。我有提到它们在Object Pascal中受到支持吗?没有,我根本没有提,并且我也不会向您展示代码示例。对我来说,goto
已经过时。
注解:还有其他语言语句,我到目前为止还没有涉及,但它们是语言定义的一部分。其中之一是
with
语句,与记录专门相关,因此我将在第5章中进行介绍。with
是另一个备受争议的语言特性,但仍然经常使用。