2012-10-09 3 views
2

myObject이라는 객체에 대한 포인터가 있다고 가정 해 봅시다. 실제로 뭔가를 가리키고 있는지 여부를 알아야합니다. 어떻게이 코드 :어떻게 BOOL에 대한 포인터를 캐스팅하면 112를 반환 할 수 있습니까?

// assume MyObjectClass *myObject; 
return (BOOL)myObject; 

반환 112? 항상 쓸 수 있다는 것을 알고 있습니다.

return (myObject == nil); 

모두 괜찮을 것입니다. 난 항상 가정 한 오늘까지하지만, 아무것도의 명시 적 캐스팅 의지가 그것의 항상 반환 true 또는 false (내가 아는 한, 0은 항상 falsetrue 같은 다른 값으로 간주) 그 BOOL과 bool로하는 YESNO 값은 "이름이 바뀌 었습니다"bool입니다. 기본적으로 내 질문은 다음과 같습니다.

  • 왜 112가 돌아 오나요? :-)
  • 명시 적 캐스팅의 결과가 C/Objective-C 표준의 어딘가에서 정의 되었습니까, 아니면 컴파일러에 특정한가요?
+0

BOOL의 정의를 살펴보십시오. 그런 다음'int a = 123; BOOL b = (BOOL) 123; int c = b;'(포인터와 관련하여 * 아무것도 * 없습니다). C에서 적절한 부울 유형을 도입 한 것은 C99라고 생각하지만 확실한 변환은 정의되지 않았습니다. (C는 C++이 아닙니다.) –

+0

Objective-C에 대해서는 모르겠지만 C에서는 bool 유형이 없으며 0이 아닌 것은 모두 true로 간주됩니다. –

+0

대신'!! myObject'를 시도해보십시오. 항상'int' 값이'0' 또는'1'입니다. – pmg

답변

4

BOOL 매크로 정의한 YES/NOsigned char위한 typedef이지만 booltrue 또는 false 수있는 실제 부울이다.

포인터의 주소를 signed char 유형으로 반올림하므로 112가 반환됩니다.
Objective-C : BOOL vs bool
Is there a difference between YES/NO,TRUE/FALSE and true/false in objective-c?

+0

'bool'은'_bool'로 정의되었지만'_bool'은'int'에 typedef됩니다 ...'BOOL'이'signed char'에 typedef된다는 점을 제외하면 무엇이 다른가요? – FurloSK

+0

'BOOL'은 매크로이고,'bool'은 C 표준입니다. 이 답변보기 : http://stackoverflow.com/a/5472736/1280800 – dreamzor

+0

그 링크를 이용해 주셔서 감사합니다. 다른 사람들이 즉시 볼 수 있도록 귀하의 답변에 추가 할 수 있습니다 ... 수락, btw ;-) – FurloSK

1

C에서 "true"의 정의는 0이 아닌 수입니다. 그러므로 C가 고려되는 한 112는 사실로 간주 될 것입니다. C99 표준에서 : 값이 0 인 경우와 비교

6.3.1.2 부울 타입

스칼라 값 _Bool로 변환되고, 결과는 0이고; 그렇지 않으면 결과는 1입니다.

BOOL not _Bool로 변환 중이므로 값이 1로 변환되지 않습니다. 0/1 로의 변환은 기술적으로 if 내부에서 처리됩니다 (실제로 if/while 형식의 명령문에서는 구현이 (myObject! = 0) 가능성이 더 높습니다). 오브젝티브 C에서

1

는 C에서, bool 부울 유형 _Bool에 대한 stdbool.h 매크로입니다 : 여기

좋은 답변 논의합니다.

그리고 0이 아닌 정수 값을 _Bool으로 변환하면 1이 생성됩니다.

즉, 1 == (bool) 42의 결과는 1입니다.

다른 정수형 (signed char을 같은)에 대한 별칭으로 BOOL 유형을 사용하는 경우, 당신은 다른 결과를 얻을 수 있습니다 :

1 == (BOOL) 42의 결과는 0입니다.

관련 문제