IF문에서 not 연산사를 사용할 때 가끔 실수할 수 있는 부분이 있는데
not 연산자 다음에 나오는 조건식의 문제로
다음의 예를 보자
var
sl : TStringList;
begin
sl := TStringList.Create;
try
if (NOT sl.Count > 0) then ShowMessage('String list is empty');
finally
FreeAndNil(sl);
end;
end;
if 구분내에 (NOT sl.count > 0) 조건식의 의도는 분명 스트링 리스트(sl)이 비어 있으면 true를 반환하라는 의미일게다
그런데 실제로 위 구문에 의해서 반환되는 값은 sl.count가 0임에도 불구하고 false를 리턴한다
위 조건식에 대한 해석을 해보면(sl.count=0 인경우)
1. sl.Count는 0이다
2. 위 표현식의 우선순위에 의해 "NOT 0"을 먼저 판단하는데 "0"은 정수이고 비트표현식으로 평가된다. 그래서 "-1"이 리턴된다.
3. 다음 연산은 (-1 > 0)이 되는데 따라서 최종 리턴되는 조건식의 결과는 false 를 리턴 한다.
위 구문을 의도한 대로 정상처리하기 위해서는 다음과 같이 바꿔주어야 한다.
if NOT (sl.Count > 0) then ShowMessage('String list is empty');
뭐 간단하거지만 실수하기 쉬운 부분이다..
반응형
'IT > 델파이' 카테고리의 다른 글
현재 어플리케이션이 활성/비활성된 상태 Detect (0) | 2023.02.13 |
---|---|
TComboBox내 아이템의 길이에 따라 가변 DropDown 만들기 (0) | 2023.02.13 |
EurekaLog와 다른 리소스 누수 탐지 모듈 (0) | 2023.02.13 |
TStringList를 이용한 문자열 중복 제거 처리 (0) | 2023.02.13 |
델파이 DataSnap을 이용한 REST 프로그래밍 요약 (0) | 2023.02.13 |