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

2012.10.19 00:01

관리자 조회 수:6903

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

컴파일러는 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 22591
공지 [UX Summit 요약] 오른쪽 클릭은 옳다 (Right Click is Right) 관리자 2020.11.16 21024
공지 [10.4 시드니] What's NEW! 신기능 자세히 보기 관리자 2020.05.27 23083
공지 RAD스튜디오(델파이,C++빌더) - 고객 사례 목록 관리자 2018.10.23 28881
공지 [데브기어 컨설팅] 모바일 앱 & 업그레이드 마이그레이션 [1] 관리자 2017.02.06 30050
공지 [전체 목록] 이 달의 기술자료 & 기술레터 관리자 2017.02.06 25397
공지 RAD스튜디오(델파이, C++빌더) - 시작하기 [1] 관리자 2015.06.30 46348
공지 RAD스튜디오(델파이,C++빌더) - 모바일 앱 개발 사례 (2020년 11월 업데이트 됨) 험프리 2014.01.16 182322
163 RAD Studio XE3, 델파이XE3, C++빌더XE3 용 핫픽스(Hotfix)4가 나왔습니다. 관리자 2012.10.30 5728
162 [델파이 문법] 문법 요소 #7 file 관리자 2012.10.29 5856
161 [델파이 문법] 문법 요소 #6 file 관리자 2012.10.25 5395
160 [웹세미나] 파이어몽키용 TMS Grid와 비주얼 라이브바인딩을 활용한 멀티-티어 애플리케이션 개발 관리자 2012.10.23 5030
159 델파이/C++빌더 XE3 수정된 버그 리스트가 올라왔습니다. 관리자 2012.10.23 5778
158 [델파이 문법] 문법 요소 #5 file 관리자 2012.10.22 5682
» [델파이 문법] 문법 요소 #4 file 관리자 2012.10.19 6903
156 David I의 31 XE3 퀵 비디오 - HTML5 빌더의 Canvas, Storage, Audio/Video 지원 관리자 2012.10.18 5335
155 [델파이 문법] 문법 요소 #3 file 관리자 2012.10.16 7260
154 David I의 31 XE3 퀵 비디오 - HTML5 빌더로 클라이언트 모바일 앱 개발하기 관리자 2012.10.15 5930
153 David I의 31 XE3 퀵 비디오 - FM2 Ancors 프로퍼티, FlowLayout과 GridLayout 관리자 2012.10.12 5497
152 [웹세미나 비디오] Delphi XE3와 HTML5 Builder의 새로워진 기능 관리자 2012.10.09 5995
151 RAD Studio XE3와 SQLite 관리자 2012.10.09 6354
150 David I의 31 XE3 퀵 비디오 - FM2로 오디오 및 비디오 캡쳐 기능 만들기 관리자 2012.10.09 5432
149 David I의 31 XE3 퀵 비디오 - FM2 미디어 플레이어 컴포넌트 활용하기 관리자 2012.10.08 5965
148 David I의 31 XE3 퀵 비디오 - 윈도우8 스타일 사용하기 관리자 2012.10.08 6183
147 XE3 - Hotfix가 올라왔습니다. 관리자 2012.10.05 4787
146 파이어몽키용 TMS 그리드의 간략한 소개 백서 관리자 2012.09.26 6894
145 RAD Studio 모바일 로드맵 공개 관리자 2012.09.21 4862
144 [델파이 문법] 문법 요소 #2 file 관리자 2012.09.20 6602