For..to/downto..do 문

For..to/downto..do 문

Free Pascal은 For 루프 구성을 지원해요. for 루프는 고정된 횟수만큼 반복해서 뭔가를 계산하고 싶을 때 사용해요.

출처: 문서

본문

여기서 Statement는 복합 문일 수 있어요. For 문을 만나면 제어 변수가 초깃값으로 초기화되고, 최종값과 비교돼요. 그 후 어떤 일이 일어나는지는 to를 쓰느냐 downto를 쓰느냐에 따라 달라져요.

  • To를 쓰는 경우: 초깃값이 최종값보다 크면 Statement는 절대 실행되지 않아요.
  • DownTo를 쓰는 경우: 초깃값이 최종값보다 작으면 Statement는 절대 실행되지 않아요.

이 검사 후에 Do 뒤의 문이 실행돼요. 문 실행 후 제어 변수는 To인지 DownTo인지에 따라 1만큼 증가하거나 감소해요. 제어 변수는 서수 타입이어야 해요. 다른 타입은 루프 카운터로 쓸 수 없어요.

기억해 두면 좋은 점들이 있어요.

  • Free Pascal은 카운터 변수를 초깃값으로 초기화하기 전에 상한을 정확히 한 번만 계산해요.
  • 루프 안에서 루프 변수의 값을 바꾸는 것(값을 대입하는 것)은 허용되지 않아요.
  • 루프가 끝난 후, 또는 루프가 전혀 실행되지 않았을 때의 루프 변수 값은 정의되지 않아요. 다만 예외나 break, goto 문으로 루프가 일찍 종료됐다면, 루프 변수는 루프를 빠져나갈 때 가지던 값을 유지해요.
  • 중첩 프로시저의 경우 루프 변수는 지역 변수여야 해요. 루프가 있는 중첩 프로시저 바깥에 루프 변수를 선언하면 컴파일러가 불만을 표시해요. 반면 프로시저에서 전역 변수를 쓰는 것은 허용돼요.
  • 컴파일러가 goto 문으로 for 루프 블록 안으로 점프하는 것을 명시적으로 금지하지는 않지만, 그렇게 하면 예측 불가능한 동작이 생겨요.

다음은 유효한 루프들이에요.

For Day := Monday to Friday do Work;
 For I := 100 downto 1 do
   WriteLn ('Counting down : ',i);
 For I := 1 to 7*dwarfs do KissDwarf(i);

다음 코드는 오류를 일으켜요.

For I:=0 to 100 do
   begin
   DoSomething;
   I:=I*2;
   end;

루프 변수 I를 루프 안에서 대입할 수 없기 때문이에요.

다음 코드도 오류를 일으켜요.

program test;
 {$ifdef fpc}
 {$mode delphi}
 {$h+}
 {$endif}
 procedure Proc;
 var
   i: integer;
   procedure Nested;
   begin
     for i := 1 to 2 do ;
   end;
 begin
 end;
 begin
 end.

INested에 정의되어 있지 않고 전역 변수도 아니기 때문이에요.

그런데 다음 코드는 컴파일돼요.

program test;
 {$ifdef fpc}
 {$mode delphi}
 {$h+}
 {$endif}
 var
   i: integer;
 procedure Nested;
 begin
   for i := 1 to 2 do ;
 end;
 begin
 end.

이번엔 i가 전역 변수라서 문제없어요.

문이 복합 문일 때는 BreakContinue 시스템 루틴을 사용해 For 문의 끝이나 끝 바로 다음으로 점프할 수 있어요. 참고로 BreakContinue는 예약어가 아니므로 오버로딩할 수 있어요.

더 알아보기