Delphi [델파이 문법] 문법 요소 #4

2012.10.19 00:01

관리자 조회 수:6849

■ 완전 부울 계산과 단축 부울 계산

컴파일러는 and 및 or 연산자에 대한 계산에 두가지 모드가 있는데, 완전 계산(complete
evaluation)과 단축 계산(short-circuit evaluation)입니다. 완전 계산은 전체 표현식의 결
과가 이미 정해졌더라도 각각의 논리곱이나 논리합이 계산된다는 것을 의미합니다. 부분 계
산은 왼쪽에서부터 오른쪽으로 계산해나가다가 전체 표현식의 결과가 정해지는 즉시 중단됩
니다. 예를 들어, A가 False인 상태에서 단축 모드로 A and B 표현식이 계산되는 경우, 컴
파일러는 B를 계산하지 않습니다. 컴파일러는 A를 계산한 직후에 전체 표현식이 False라는
것을 알기 때문입니다.

단축 계산이 실행 시간을 최소화하고 또 대부분의 경우 코드 크기를 최소화하기 때문에 일반
적으로 더 많이 사용됩니다. 한 피연산자가 함수이고 프로그램의 실행을 바꿀 수 있는 부작
용이 있는 경우에는 완전 계산이 편리합니다.
또한 단축 계산은 경우에 따라 잘못된 런타임 연산을 피할 수 있게 해 줍니다. 예를 들어, 다
음 코드는 문자열 S에서 첫 번째 쉼표를 만날 때까지 반복됩니다.

1.png

만약 S에 쉼표가 없으면, 마지막 반복에서 I 값이 증가하여 S의 길이보다 큰 값을 가지게 됩
니다. while 조건문이 다음 조건을 테스트하려 하면 완전 계산은 S[I]를 읽으려고 시도하게
되어 런타임 에러를 일으킬 수 있습니다. 반대로, 단축 계산에서는 while의 첫번째 조건이
실패하므로두번째조건(S[I] <>‘ ,’)는 계산되지않습니다.

$B 컴파일러 지시어를 사용하면 계산 모드를 지정할 수 있습니다. 기본 상태는 {$B-}로서
단축 계산 모드입니다. 코드 일부에서 완전 계산 모드로 지정하려면 코드에 {$B+} 지시어
를 추가하십시오. 프로젝트 전체를 완전 계산 모드로 지정하려면, Compiler Option 다이얼
로그에서 Compiler Boolean Evaluation을 선택하면 됩니다.


논리(비트 단위) 연산자
다음의 논리 연산자들은 정수 피연산자를 비트 단위(bitwise)로 조작합니다. 예를 들어, X에
저장된 값이 001101이고 Y에 저장된 값이 100001일 경우 다음의 문장은,

2.png

Z에 값 101101을 대입합니다.


3.png

비트 단위 연산자에는 다음과 같은 규칙이 적용됩니다.

   : not 연산의 결과는 피연산자와 같은 타입이 됩니다.

   : and, or 또는 xor 연산의 피연산자가 둘 다 정수인 경우 그 결과는 두 타입의 모든 가능한
     값을 포함하는 가장 작은 범위의 이미 정의된 정수 타입을 가집니다.

   : x shl y와 x shr y 연산은 x의값을 왼쪽 혹은 오른쪽으로 y 비트만큼 시프트하는데,
     결과 값은 x를 2 로 곱하거나 나눈 것과 동일합니다. 그 결과는 x와 같은 타입을 가집니다.
     예를 들어, N이 01101 (십진수 13) 값을 저장하고 있는 경우, N shl 1은 11010 (십진수 26)을
     리턴합니다.


문자열 연산자
관계 연산자 =, <>, <, >, <= 및 >=는 모두 문자열 피연산자를 가질 수 있습니다
(3장의“관계 연산자”참조). + 연산자는 두 문자열을 연결합니다.

4.png

문자열 연결에는 다음과 같은 규칙이 적용됩니다.

   : +의 피연산자는 문자열, packed 문자열(Char 타입의 압축 배열) 또는 문자일 수 있습니다.
      그러나, 하나의 피연산자가 WideChar 타입인 경우, 다른 피연산자는 긴 문자열
      (AnsiString이나 WideString)이어야 합니다.

   : + 연산의 결과는 모든 문자열 타입과 호환됩니다. 그러나, 피연산자가 모두 짧은 문자열 혹은
      문자이고 합한 길이가 255보다 클 경우, 결과는 앞의 255개 문자까지 잘린 값입니다.




포인터 연산자

관계 연산자 <, >, <= 및 >=는 PChar와 PWideChar 타입의 피연산자를 가질 수 있습니다

(3장의“관계 연산자”참조). 다음 연산자도 피연산자로서 포인터를 가질 수 있습니다. 포인

터에 대한 자세한 내용은 4장의“포인터와 포인터 타입(Pointer type)”을 참조하십시오.

5.png

^ 연산자는 포인터를 역참조합니다. 모든 타입의 포인터가 ^ 연산자의 피연산자가 될 수 있

는데, 일반 Pointer는 예외로서 역참조하기 전에 타입 캐스트되어야 합니다.

P == Q는 P와 Q가 같은 주소를 가리키는 경우에만 True입니다. 그렇지 않은 경우에 P <>

Q가 True입니다.

+와 - 연산자를 사용하여 문자 포인터의 오프셋을 증가시키고 감소시킬 수 있습니다. 또한

-를 사용하여 두 문자 포인터의 오프셋 차이를 계산할 수 있습니다. 다음과 같은 규칙이 적

용됩니다.

   : I가 정수이고 P가 문자 포인터인 경우, P + I는 P의 주소에 I를 더합니다. 즉, P 주소에서
      I 문자만큼 더한 주소의 포인터를 리턴합니다. (표현식 I + P는 P + I와 동일합니다.)
     P - I는 P 주소에서 I를 뺍니다. 즉, P 주소에서 I 문자만큼 뺀 주소의 포인터를 리턴합니다.
     이것은 P가 PChar포인터일 경우이고, P가 PWideChar 포인터일 경우에 P + I는 P에
     SizeOf(WideChar)를 더합니다.


   : P와 Q가 모두 문자 포인터인 경우 P - Q는 P 주소(상위 주소)와 Q 주소(하위 주소) 간의
     차이를 계산합니다. 즉, P와 Q 사이의 문자 수를 나타내는 정수를 리턴합니다. 

      P + Q는 허용되지 않습니다.


번호 제목 글쓴이 날짜 조회 수
공지 [DelphiCon 요약] 코드사이트 로깅 실전 활용 기법 (Real-world CodeSite Logging Techniques) 관리자 2021.01.19 15440
공지 [UX Summit 요약] 오른쪽 클릭은 옳다 (Right Click is Right) 관리자 2020.11.16 13961
공지 [10.4 시드니] What's NEW! 신기능 자세히 보기 관리자 2020.05.27 16499
공지 RAD스튜디오(델파이,C++빌더) - 고객 사례 목록 관리자 2018.10.23 22055
공지 [데브기어 컨설팅] 모바일 앱 & 업그레이드 마이그레이션 [1] 관리자 2017.02.06 23268
공지 [전체 목록] 이 달의 기술자료 & 기술레터 관리자 2017.02.06 18923
공지 RAD스튜디오(델파이, C++빌더) - 시작하기 [1] 관리자 2015.06.30 39255
공지 RAD스튜디오(델파이,C++빌더) - 모바일 앱 개발 사례 (2020년 11월 업데이트 됨) 험프리 2014.01.16 174699
170 [추가된 문법] DLL 정적 호출 시 지연 호출(Delayed)-델파이 2010 추가 김원경 2016.12.27 1096
169 부동소수점 숫자(실수)에 대한 참고 글 [1] 험프리 2016.12.14 1140
168 퀵레포트(Quick Report)에 사진 출력하기 험프리 2016.08.01 1864
167 BLOB 컬럼에 (이미지 등의)데이터 읽고 쓰기 험프리 2016.08.01 6093
166 1차 공개 중고생 강의용 앱 소스 및 메뉴얼입니다. file 쭈니아빠 2016.07.16 762
165 [추가된 문법 정리] - 배열 상수 초기화:델파이 XE7 추가 관리자 2016.06.03 3323
164 [추가된 문법 정리] - 클래스 필드(Class Field):델파이 2007 추가 관리자 2016.06.03 828
163 브레이크 포인트를 설정해도 디버깅이 안되는 경우 살펴볼 항목 file 험프리 2016.05.13 2806
162 OutputDebugString 함수로 디버그로그를 출력할 수 있습니다. file 험프리 2016.02.16 4264
161 [안드로이드] 배포파일, 아이콘, 스플래쉬 등이 잘 배포되었는지 확인하기 file 험프리 2015.11.11 1524
160 [다시보기] RAD Studio 10 시애틀 딥다이브 세션 다시보기(영문) Humphery 2015.10.02 552
159 [마이그레이션] 함수(또는 변수)에 빨간밑줄이 가고 컴파일 시 Undeclared Identifier 오류 시 조치방법 file 험프리 2015.09.30 2367
158 델파이 문서화 도구 참고링크 Humphery 2015.09.11 1161
157 [하이브리드 앱 개발] 웹페이지에서 델파이 함수 호출하기 Humphery 2015.06.26 4073
156 안드로이드 웹브라우저에서 "tel:, sms:" 링크가 동작하지 않는 이슈 해결하기 Humphery 2015.06.26 4828
155 [윈도우10] 델파이로 윈도우10 알림 표시하기(WinRT API 이용) Humphery 2015.06.24 2312
154 파이어닥(FireDAC)으로 IBLite 연결 시 "unavaliable database." 오류 발생에 대한 대응 file Humphery 2015.05.15 768
153 델파이에서 MSOffice 엑셀과 워드 연동 참고자료. [1] Humphery 2015.04.27 3769
152 [델파이7 이후 새로운 기능][XE2~] 프로젝트 매니저에서 타겟플랫폼을 64-bit Windows로 선택 해 64비트 애플리케이션을 개발할 수 있습니다. file Humphery 2015.04.23 4723
151 [델파이7 이후 새로운 기능] 추가되고 개선된 VCL 컴포넌트 Humphery 2015.04.22 3574