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

2012.10.19 00:01

관리자 조회 수:6862

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

컴파일러는 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 17885
공지 [UX Summit 요약] 오른쪽 클릭은 옳다 (Right Click is Right) 관리자 2020.11.16 16240
공지 [10.4 시드니] What's NEW! 신기능 자세히 보기 관리자 2020.05.27 18884
공지 RAD스튜디오(델파이,C++빌더) - 고객 사례 목록 관리자 2018.10.23 24476
공지 [데브기어 컨설팅] 모바일 앱 & 업그레이드 마이그레이션 [1] 관리자 2017.02.06 25852
공지 [전체 목록] 이 달의 기술자료 & 기술레터 관리자 2017.02.06 21214
공지 RAD스튜디오(델파이, C++빌더) - 시작하기 [1] 관리자 2015.06.30 41804
공지 RAD스튜디오(델파이,C++빌더) - 모바일 앱 개발 사례 (2020년 11월 업데이트 됨) 험프리 2014.01.16 177107
163 [C++빌더 신기능] C++ 리네임 리팩토링 관리자 2019.04.18 422
162 이 달의 기술자료 - 2018년 05월 file 험프리 2018.04.27 421
161 [디버깅 작업] 코드사이트 – 무료 EXPRESS 에디션 활용하기 관리자 2021.05.20 420
160 개발을 할 때 조심해야 하는 포인트 '도구의 법칙과 개발자의 저주' 관리자 2020.02.13 419
159 [도서/PDF] 한 번에 개발하는 안드로이드&iOS 앱 with 델파이 2편 - 0장. 책 소개. 저자 소개. 목차 file 관리자 2020.02.06 419
158 [도서/PDF] 한 번에 개발하는 안드로이드&iOS 앱 with 델파이 1편 - 8장(실습). 웹서비스를 이용한 음반 정보 앱 [1] 관리자 2020.02.04 419
157 [고객사례-사물인터넷, 앱, 델파이] 로봇청소기 제어 앱 '니토 툴리오' 관리자 2020.03.24 418
156 [팁] 10.3 리오 버전에서 사용할 수 있는 C++ 기능들 file 관리자 2019.12.17 418
155 [10.3 리오][업데이트 2] 델파이 리눅스 클라이언트 애플리케이션 지원 관리자 2019.09.10 418
154 [도서/PDF] 한 번에 개발하는 안드로이드&iOS 앱 with 델파이 1편 - 5장. UI 컨트롤 기본 사용법 관리자 2020.02.04 416
153 [발표자료] 20190718 멀티-플랫폼 앱 멋지게! 쉽게! 빠르게! 완성하기 file 관리자 2019.07.19 416
152 이 달의 기술자료 - 2020년 01월 험프리 2019.12.26 415
151 C++17 알고리즘 라이브러리 병렬 정렬 사용하기 관리자 2020.08.13 412
150 인터베이스와 FireDac에서 배열필드 사용하기 file 김원경 2020.04.16 411
149 [델파이 게임 개발] 겟잇(GETIT)에서 ALIEN INVASION 다운로드 받기 관리자 2020.11.30 410
148 리눅스 앱에 '프로페셔널' 해보이는 스타일을 적용하고 싶다면 - Blend FMX 스타일 관리자 2019.09.09 410
147 [10.3 리오][업데이트 3] iOS 13, 맥OS 카탈리나 지원을 시작하세요. file 관리자 2019.11.22 409
146 [UX Summit 요약] 레거시 데스크탑 앱 UI/UX 현대화 – 이론부터 실제까지 (Legacy desktop apps UI & UX modernization. From theory to practice) 관리자 2020.11.04 408
145 리눅스 앱에 '깔끔하면서도 샤프한' 스타일을 적용하고 싶다면 - Air 스타일 관리자 2019.09.09 408
144 MODERNLISTVIEW 라이브러리 – 커스터마이징 가능한 강력한 크로스 플랫폼 라이브러리 활용 방법 관리자 2021.04.06 407