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.
I가 Nested에 정의되어 있지 않고 전역 변수도 아니기 때문이에요.
그런데 다음 코드는 컴파일돼요.
program test;
{$ifdef fpc}
{$mode delphi}
{$h+}
{$endif}
var
i: integer;
procedure Nested;
begin
for i := 1 to 2 do ;
end;
begin
end.
이번엔 i가 전역 변수라서 문제없어요.
문이 복합 문일 때는 Break와 Continue 시스템 루틴을 사용해 For 문의 끝이나 끝 바로 다음으로 점프할 수 있어요. 참고로 Break와 Continue는 예약어가 아니므로 오버로딩할 수 있어요.