Case 문
Case 문
Free Pascal은 case 문을 지원해요.
출처: 문서
본문
여러 case 분기에 나타나는 상수들은 컴파일 시점에 알려져 있어야 해요. 그리고 그 타입은 열거형, 서수 타입(문자 포함), 문자열 타입 중 하나일 수 있어요. case 표현식도 이 타입이어야 하며, 그렇지 않으면 컴파일러 오류가 나요. 또 모든 case 상수는 타입이 같아야 해요.
컴파일러는 case 표현식을 평가해요. case 상수 중 하나의 값이 표현식의 값과 일치하면, 그 상수 뒤에 오는 문이 실행돼요. 그 후 프로그램은 마지막 end 다음에서 계속돼요.
case 상수 중 어느 것도 표현식 값과 일치하지 않으면, else 또는 otherwise 키워드 뒤의 문 목록이 실행돼요. 이 문 목록은 비어 있을 수도 있어요. else 부분이 없고 일치하는 case 상수도 없으면, 프로그램 흐름은 마지막 end 다음으로 계속돼요.
case 문들은 복합 문(Begin..End 블록)일 수 있어요. 다만 else 경우에는 여러 문이 허용돼요(문법 다이어그램에서 볼 수 있듯이). 추가로 Begin..End 블록으로 감쌀 수도 있지만 필수는 아니에요.
한 가지 주의할 점이 있어요. Turbo Pascal과 달리 Free Pascal에서는 중복된 case 레이블이 허용되지 않아요. 그래서 다음 코드는 컴파일할 때 오류가 나요.
Var i : integer;
...
Case i of
3 : DoSomething;
1..5 : DoSomethingElse;
end;
3이 범위 1..5에 (암묵적으로) 포함되기 때문에, 컴파일러는 이 코드를 컴파일할 때 Duplicate case label 오류를 내요. 이는 Delphi 문법과 비슷해요.
다음은 유효한 case 문들이에요.
Case C of
'a' : WriteLn ('A pressed');
'b' : WriteLn ('B pressed');
'c' : WriteLn ('C pressed');
else
WriteLn ('unknown letter pressed : ',C);
end;
또는
Case C of
'a','e','i','o','u' : WriteLn ('vowel pressed');
'y' : WriteLn ('This one depends on the language');
else
WriteLn ('Consonant pressed');
end;
Case Number of
1..10 : WriteLn ('Small number');
11..100 : WriteLn ('Normal, medium number');
else
WriteLn ('HUGE number');
end;
else 절은 여러 문을 담을 수 있어요.
Case Number of
1..10 : WriteLn ('Small number');
11..100 : WriteLn ('Normal, medium number');
else
WriteLn ('HUGE number');
Writeln('How did we get this much ?');
end;
Free Pascal은 문자열을 case 레이블로 사용하는 것도 허용해요. 이 경우 case 변수도 문자열이어야 해요. 문자열 타입을 쓸 때는 case 변수와 각 레이블이 대소문자 구분 방식으로 비교돼요.
Case lowercase(OS) of
'windows',
'dos' : WriteLn ('Microsoft platform);
'macos',
'darwin' : Writeln('Apple platform');
'linux',
'freebsd',
'netbsd' : Writeln('Community platform');
else
WriteLn ('Other platform');
end;
문자열을 쓰는 case 문은 일련의 if then else 문과 동일하며, 최적화는 수행되지 않아요.
하지만 범위는 허용되는데, 다음 코드와 동일해요.
if (value>=beginrange) and (value<=endrange) then
begin
end;