본문 바로가기

프로그래밍/Delphi

[Delphi] IF문에서 not 연산자를 사용할때 주의할 점

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');

뭐 간단하거지만 실수하기 쉬운 부분이다..