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

2012.10.19 00:01

관리자 조회 수:6848

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

컴파일러는 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 15417
공지 [UX Summit 요약] 오른쪽 클릭은 옳다 (Right Click is Right) 관리자 2020.11.16 13960
공지 [10.4 시드니] What's NEW! 신기능 자세히 보기 관리자 2020.05.27 16496
공지 RAD스튜디오(델파이,C++빌더) - 고객 사례 목록 관리자 2018.10.23 22048
공지 [데브기어 컨설팅] 모바일 앱 & 업그레이드 마이그레이션 [1] 관리자 2017.02.06 23267
공지 [전체 목록] 이 달의 기술자료 & 기술레터 관리자 2017.02.06 18921
공지 RAD스튜디오(델파이, C++빌더) - 시작하기 [1] 관리자 2015.06.30 39245
공지 RAD스튜디오(델파이,C++빌더) - 모바일 앱 개발 사례 (2020년 11월 업데이트 됨) 험프리 2014.01.16 174696
130 XE7에서 추가 된 안드로이드 프로젝트에서 외부 라이브러리(jar) 사용을 위한 정보 [1] Humphery 2014.11.03 3223
129 8단계로 완성하는 "2014년 출시 앨범" 앱 개발 따라하기 [1] file Humphery 2014.10.07 3656
128 [온라인 세미나 발표자료] RAD Studio XE7! 관리자 2014.09.17 1641
127 [기술문서] 델파이와 유니코드 관리자 2014.09.16 1936
126 [기술문서] 델파이XE2와 파이어몽키 관리자 2014.09.16 1657
125 [기술문서] Delphi 코딩 스타일과 아키텍처(Delphi 2009의 언어 기능 리뷰) 관리자 2014.09.16 1536
124 [Step UP! 마이그레이션] RAD 업그레이드 마이그레이션 기술 브리핑 자료(2014.8.21) 관리자 2014.08.22 1995
123 델파이를 이용해 구글크롬캐스트와 연결 Humphery 2014.07.22 2620
122 델파이 물리엔진 Box2d 소개. FMX, VCL 용(오픈소스) [1] Humphery 2014.04.22 4181
121 [XE5만의 특별한 기능] 응답하라! Delphi VCL 개발자 관리자 2013.12.21 4890
120 Runtime Packages 옵션으로 프로그램(배포) 용량 줄이기 [4] file Humphery 2013.12.19 7764
119 ComPort(시리얼 통신) 컴포넌트 설치안내 [11] file 험프리 2013.12.04 107144
118 11월 26일 "RAD Studio XE5 따라잡기: 모바일 개발 퀵스타트 LIVE!" 발표자료입니다. file 관리자 2013.12.03 3596
117 엔터프라이즈 데이터 기반의 모바일 앱 과정(2일) 우선 등록 안내 관리자 2013.11.21 2720
116 델파이 안드로이드앱에서 jar 클래스 사용하기 file 관리자 2013.10.31 5327
115 Release Notes for XE5 Update 1 c2design 2013.10.29 3380
114 델파이1 부터 델파이XE5까지의 역사 관리자 2013.10.26 4684
113 iOS 7 앱 개발을 위한 XE5 업데이트 제공 안내 관리자 2013.10.15 3875
112 CodeRage 8: Delphi 온라인 무료 세미나 개최 관리자 2013.10.15 3362
111 iOS UI 디자인 (델파이XE4 활용) 관리자 2013.07.19 3783