Delphi/Pascal 的正确结构语法 if then begin end and ;
Proper structure syntax for Delphi/Pascal if then begin end and ;
自从我上次不得不用 Pascal 编写代码以来,已经有大约 20 年了。我似乎无法在使用 begin
和 end
嵌套 if then
块的地方正确使用语言的结构元素。例如,这让我得到一个编译器错误 "Identifier Expected".
procedure InitializeWizard;
begin
Log('Initialize Wizard');
if IsAdminLoggedOn then begin
SetupUserGroup();
SomeOtherProcedure();
else begin (*Identifier Expected*)
Log('User is not an administrator.');
msgbox('The current user is not administrator.', mbInformation, MB_OK);
end
end;
end;
当然,如果我删除 if then
块和与它们关联的 begin end
块,那么一切都可以。
有时我会正确地理解这种语法并且它运行良好,但是当嵌套 if then else
块时问题变得更加严重。
解决问题还不够。我想更好地了解如何使用这些块。我显然缺少一个概念。来自 C++ 或 C# 的某些东西可能从我脑海的另一部分悄悄进入并扰乱了我的理解。我已经阅读了几篇关于它的文章,我认为我理解它,但我不理解。
您必须将每个 begin
与同一级别的 end
匹配,例如
if Condition then
begin
DoSomething;
end
else
begin
DoADifferentThing;
end;
如果您愿意,可以在不影响布局的情况下缩短使用的行数。 (不过,当您第一次习惯语法时,上面的内容可能会更容易。)
if Condition then begin
DoSomething
end else begin
DoADifferentThing;
end;
如果您正在执行单个语句,则 begin..end
是可选的。请注意,第一个条件不包含终止 ;
,因为您尚未结束语句:
if Condition then
DoSomething
else
DoADifferentThing;
分号在块的最后一个语句中是可选的(尽管我通常会在它是可选的时候包含它,以避免将来添加一行时忘记同时更新前一行时出现问题)。
if Condition then
begin
DoSomething; // Semicolon required here
DoSomethingElse; // Semicolon optional here
end; // Semicolon required here unless the
// next line is another 'end'.
您也可以组合单个和多个语句块:
if Condition then
begin
DoSomething;
DoSomethingElse;
end
else
DoADifferentThing;
if Condition then
DoSomething
else
begin
DoADifferentThing;
DoAnotherDifferentThing;
end;
代码的正确用法是:
procedure InitializeWizard;
begin
Log('Initialize Wizard');
if IsAdminLoggedOn then
begin
SetupUserGroup();
SomeOtherProcedure();
end
else
begin
Log('User is not an administrator.');
msgbox('The current user is not administrator.', mbInformation, MB_OK);
end;
end;
自从我上次不得不用 Pascal 编写代码以来,已经有大约 20 年了。我似乎无法在使用 begin
和 end
嵌套 if then
块的地方正确使用语言的结构元素。例如,这让我得到一个编译器错误 "Identifier Expected".
procedure InitializeWizard;
begin
Log('Initialize Wizard');
if IsAdminLoggedOn then begin
SetupUserGroup();
SomeOtherProcedure();
else begin (*Identifier Expected*)
Log('User is not an administrator.');
msgbox('The current user is not administrator.', mbInformation, MB_OK);
end
end;
end;
当然,如果我删除 if then
块和与它们关联的 begin end
块,那么一切都可以。
有时我会正确地理解这种语法并且它运行良好,但是当嵌套 if then else
块时问题变得更加严重。
解决问题还不够。我想更好地了解如何使用这些块。我显然缺少一个概念。来自 C++ 或 C# 的某些东西可能从我脑海的另一部分悄悄进入并扰乱了我的理解。我已经阅读了几篇关于它的文章,我认为我理解它,但我不理解。
您必须将每个 begin
与同一级别的 end
匹配,例如
if Condition then
begin
DoSomething;
end
else
begin
DoADifferentThing;
end;
如果您愿意,可以在不影响布局的情况下缩短使用的行数。 (不过,当您第一次习惯语法时,上面的内容可能会更容易。)
if Condition then begin
DoSomething
end else begin
DoADifferentThing;
end;
如果您正在执行单个语句,则 begin..end
是可选的。请注意,第一个条件不包含终止 ;
,因为您尚未结束语句:
if Condition then
DoSomething
else
DoADifferentThing;
分号在块的最后一个语句中是可选的(尽管我通常会在它是可选的时候包含它,以避免将来添加一行时忘记同时更新前一行时出现问题)。
if Condition then
begin
DoSomething; // Semicolon required here
DoSomethingElse; // Semicolon optional here
end; // Semicolon required here unless the
// next line is another 'end'.
您也可以组合单个和多个语句块:
if Condition then
begin
DoSomething;
DoSomethingElse;
end
else
DoADifferentThing;
if Condition then
DoSomething
else
begin
DoADifferentThing;
DoAnotherDifferentThing;
end;
代码的正确用法是:
procedure InitializeWizard;
begin
Log('Initialize Wizard');
if IsAdminLoggedOn then
begin
SetupUserGroup();
SomeOtherProcedure();
end
else
begin
Log('User is not an administrator.');
msgbox('The current user is not administrator.', mbInformation, MB_OK);
end;
end;