私が最後にパスカルで書かなければならなかったのは約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;