web-dev-qa-db-ja.com

Pascalの適切な構造構文ifthen begin end and;

私が最後にパスカルで書かなければならなかったのは約20年です。 beginendを使用して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#の何かが、おそらく私の心の別の部分から忍び寄り、私の理解を台無しにしています。私はそれについていくつかの記事を読みました、そして私はそれを理解していると思います、そして私は理解していません。

12
amalgamate

すべての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;
30
Ken White