2015-01-29 3 views
7

파스칼에서 마지막으로 작성한 지 20 년이되었습니다. 시작과 끝을 사용하는 블록보다 둥지를 틀면 언어의 구조 요소를 올바르게 사용할 수 없습니다. 예를 들어이 나에게 나는 if then 블록 후 모든 것이 OK입니다 그들과 관련된 begin end 블록을 제거하면 물론파스칼에 대한 올바른 구조 구문은 begin과; (Inno Setup에서)

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 else 블록을 중첩 할 때 문제가 격렬 해집니다.

여기에서 문제를 해결하는 것만으로는 충분하지 않습니다. 이 블록을 사용하는 방법을 더 잘 이해하고 싶습니다. 나는 분명히 개념이 빠져있다. C++ 또는 C#의 일부가 아마도 내 마음의 다른 부분에서 들어와 내 이해를 망칠 것입니다. 나는 그것에 관한 몇 가지 기사를 읽었으며 잘 이해하고 생각하지 않는다.

답변

24

당신은 당신이 원하는 경우, 배치에 영향을주지 않고 사용하는 라인의 수를 줄일 수 있습니다

if Condition then 
begin 
    DoSomething; 
end 
else 
begin 
    DoADifferentThing; 
end; 

처럼, 같은 수준에서 end와 모든 begin 일치해야합니다. (당신이 처음하지만, 구문에 익숙해 때 위가 쉬울 수 있습니다.)

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; 
+0

은 어떻게 든 내가 잘못된 인상을 가지고 그 다른 블록 시작 블록을 끝냈다 .... 나는 그 미친 아이디어를 어디서 얻었는지 전혀 모른다. 매우 도움이됩니다. 감사합니다. – amalgamate

+0

엔드 블록은 if then 블록을 종료하지 않습니다 .... 그렇습니까? 그저 ';' – amalgamate

+1

@amalgamate :'begin'을 사용하지 않으면'end'가 필요 없습니다. 위의 세 번째 코드 샘플을 참조하십시오. –