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 15427
공지 [UX Summit 요약] 오른쪽 클릭은 옳다 (Right Click is Right) 관리자 2020.11.16 13961
공지 [10.4 시드니] What's NEW! 신기능 자세히 보기 관리자 2020.05.27 16497
공지 RAD스튜디오(델파이,C++빌더) - 고객 사례 목록 관리자 2018.10.23 22054
공지 [데브기어 컨설팅] 모바일 앱 & 업그레이드 마이그레이션 [1] 관리자 2017.02.06 23268
공지 [전체 목록] 이 달의 기술자료 & 기술레터 관리자 2017.02.06 18922
공지 RAD스튜디오(델파이, C++빌더) - 시작하기 [1] 관리자 2015.06.30 39252
공지 RAD스튜디오(델파이,C++빌더) - 모바일 앱 개발 사례 (2020년 11월 업데이트 됨) 험프리 2014.01.16 174698
763 안드로이드에서 Firebase SDK 용 Google 로그인 사용하기 험프리 2017.08.04 619
762 첨부파일을 포함한 이메일 전송하기(iOS, 안드로이드, 윈도우) file 험프리 2017.08.04 665
761 이 달의 기술자료 - 2017년 08월 험프리 2017.07.28 518
760 세일즈포스(Salesforce) 데이터, RAD스튜디오 데이터 익스플로러로 연동하기 file 관리자 2017.07.26 809
759 Tools API를 사용해 IDE를 확장할 수 있습니다. file 험프리 2017.07.20 498
758 파이어몽키(FireMonkey) vs. VCL 관리자 2017.07.18 2843
757 엔터프라이즈 커넥터로 '트위터' 연동하기 file 관리자 2017.07.17 922
756 엔터프라이즈 커넥터 - 엠바카데로의 새로운 솔루션 [1] file 관리자 2017.07.12 1975
755 겟잇 패키지 매니저를 사용하면 협업을 위한 프로젝트 공유와 전환이 간편해집니다. 험프리 2017.07.07 471
754 이 달의 기술자료 - 2017년 07월 험프리 2017.07.03 490
753 [업데이트][핫픽스][10.2 도쿄] FireMonkey의 Android 호환성 패치 험프리 2017.07.03 667
752 [발표자료] 20170623 최신OS와 멀티플랫폼 개발 전략 with RAD Studio [2] 관리자 2017.06.26 380
751 [고객 사례- 쇼핑, 모바일앱, 델파이] 매일 최저가 상품을 보여주는 'Daily Offer' 관리자 2017.06.21 662
750 RAD서버로 개발은 확장하면서도 비용을 절감하는 방법 (RAD서버 라이선스 유형별 정리) file 관리자 2017.06.20 1633
749 [REST API][실습] 데이터셋 기반 REST API 개발하기 험프리 2017.06.13 2177
748 이 달의 기술자료 - 2017년 06월 file 험프리 2017.05.30 525
747 [발표자료] REST API 웹서비스 연동 관리자 2017.05.29 1473
746 [REST API][실습] REST API 클라이언트 개발하기(REST Client 이용) [2] 험프리 2017.05.23 7097
745 [REST API][실습] REST API 서버 개발하기(엔드포인트 구현, RAD 서버 이용) [5] 험프리 2017.05.23 4513
744 [REST API] REST API 이해하기 험프리 2017.05.23 15258